OLD | NEW |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 /// Generate code using the cps-based IR pipeline. | 5 /// Generate code using the cps-based IR pipeline. |
6 library code_generator_task; | 6 library code_generator_task; |
7 | 7 |
8 import 'glue.dart'; | 8 import 'glue.dart'; |
9 import 'codegen.dart'; | 9 import 'codegen.dart'; |
10 import 'unsugar.dart'; | 10 import 'unsugar.dart'; |
(...skipping 21 matching lines...) Expand all Loading... |
32 import '../../tree_ir/tree_ir_integrity.dart'; | 32 import '../../tree_ir/tree_ir_integrity.dart'; |
33 import '../../cps_ir/cps_ir_nodes_sexpr.dart'; | 33 import '../../cps_ir/cps_ir_nodes_sexpr.dart'; |
34 | 34 |
35 class CpsFunctionCompiler implements FunctionCompiler { | 35 class CpsFunctionCompiler implements FunctionCompiler { |
36 final ConstantSystem constantSystem; | 36 final ConstantSystem constantSystem; |
37 // TODO(karlklose): remove the compiler. | 37 // TODO(karlklose): remove the compiler. |
38 final Compiler compiler; | 38 final Compiler compiler; |
39 final Glue glue; | 39 final Glue glue; |
40 final SourceInformationStrategy sourceInformationFactory; | 40 final SourceInformationStrategy sourceInformationFactory; |
41 | 41 |
42 // TODO(karlklose,sigurm): remove and update dart-doc of [compile]. | 42 // TODO(karlklose,sigurdm): remove and update dart-doc of [compile]. |
43 final FunctionCompiler fallbackCompiler; | 43 final FunctionCompiler fallbackCompiler; |
44 | 44 |
45 Tracer get tracer => compiler.tracer; | 45 Tracer get tracer => compiler.tracer; |
46 | 46 |
47 IrBuilderTask get irBuilderTask => compiler.irBuilder; | 47 IrBuilderTask get irBuilderTask => compiler.irBuilder; |
48 | 48 |
49 CpsFunctionCompiler(Compiler compiler, JavaScriptBackend backend, | 49 CpsFunctionCompiler(Compiler compiler, JavaScriptBackend backend, |
50 SourceInformationStrategy sourceInformationFactory) | 50 SourceInformationStrategy sourceInformationFactory) |
51 : fallbackCompiler = | 51 : fallbackCompiler = |
52 new ssa.SsaFunctionCompiler(backend, sourceInformationFactory), | 52 new ssa.SsaFunctionCompiler(backend, sourceInformationFactory), |
53 this.sourceInformationFactory = sourceInformationFactory, | 53 this.sourceInformationFactory = sourceInformationFactory, |
54 constantSystem = backend.constantSystem, | 54 constantSystem = backend.constantSystem, |
55 compiler = compiler, | 55 compiler = compiler, |
56 glue = new Glue(compiler); | 56 glue = new Glue(compiler); |
57 | 57 |
58 String get name => 'CPS Ir pipeline'; | 58 String get name => 'CPS Ir pipeline'; |
59 | 59 |
60 JavaScriptBackend get backend => compiler.backend; | 60 JavaScriptBackend get backend => compiler.backend; |
61 | 61 |
62 /// Generates JavaScript code for `work.element`. | 62 /// Generates JavaScript code for `work.element`. |
63 js.Fun compile(CodegenWorkItem work) { | 63 js.Fun compile(CodegenWorkItem work) { |
64 AstElement element = work.element; | 64 AstElement element = work.element; |
65 JavaScriptBackend backend = compiler.backend; | 65 JavaScriptBackend backend = compiler.backend; |
66 return compiler.withCurrentElement(element, () { | 66 return compiler.withCurrentElement(element, () { |
67 try { | 67 try { |
68 // TODO(karlklose): remove this fallback. | 68 // TODO(karlklose): remove this fallback when we do not need it for |
69 // Fallback for a few functions that we know require try-finally and | 69 // testing anymore. |
70 // switch. | 70 if (false) { |
71 if (element.isNative) { | |
72 compiler.log('Using SSA compiler for platform element $element'); | 71 compiler.log('Using SSA compiler for platform element $element'); |
73 return fallbackCompiler.compile(work); | 72 return fallbackCompiler.compile(work); |
74 } | 73 } |
75 | 74 |
76 if (tracer != null) { | 75 if (tracer != null) { |
77 tracer.traceCompilation(element.name, null); | 76 tracer.traceCompilation(element.name, null); |
78 } | 77 } |
79 cps.FunctionDefinition cpsFunction = compileToCpsIR(element); | 78 cps.FunctionDefinition cpsFunction = compileToCpsIR(element); |
80 cpsFunction = optimizeCpsIR(cpsFunction); | 79 cpsFunction = optimizeCpsIR(cpsFunction); |
81 tree_ir.FunctionDefinition treeFunction = compileToTreeIR(cpsFunction); | 80 tree_ir.FunctionDefinition treeFunction = compileToTreeIR(cpsFunction); |
(...skipping 11 matching lines...) Expand all Loading... |
93 throw new CodegenBailout(null, reason); | 92 throw new CodegenBailout(null, reason); |
94 } | 93 } |
95 | 94 |
96 void traceGraph(String title, var irObject) { | 95 void traceGraph(String title, var irObject) { |
97 if (tracer != null) { | 96 if (tracer != null) { |
98 tracer.traceGraph(title, irObject); | 97 tracer.traceGraph(title, irObject); |
99 } | 98 } |
100 } | 99 } |
101 | 100 |
102 cps.FunctionDefinition compileToCpsIR(AstElement element) { | 101 cps.FunctionDefinition compileToCpsIR(AstElement element) { |
103 // TODO(sigurdm): Support these constructs. | |
104 if (element.isNative) { | |
105 giveUp('unsupported element kind: ${element.name}:${element.kind}'); | |
106 } | |
107 | |
108 cps.FunctionDefinition cpsNode = irBuilderTask.buildNode(element); | 102 cps.FunctionDefinition cpsNode = irBuilderTask.buildNode(element); |
109 if (cpsNode == null) { | 103 if (cpsNode == null) { |
110 if (irBuilderTask.bailoutMessage == null) { | 104 if (irBuilderTask.bailoutMessage == null) { |
111 giveUp('unable to build cps definition of $element'); | 105 giveUp('unable to build cps definition of $element'); |
112 } else { | 106 } else { |
113 giveUp(irBuilderTask.bailoutMessage); | 107 giveUp(irBuilderTask.bailoutMessage); |
114 } | 108 } |
115 } | 109 } |
116 traceGraph("IR Builder", cpsNode); | 110 traceGraph("IR Builder", cpsNode); |
117 // Eliminating redundant phis before the unsugaring pass will make it | 111 // Eliminating redundant phis before the unsugaring pass will make it |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
229 // TODO(sigurdm): Make a better list of tasks. | 223 // TODO(sigurdm): Make a better list of tasks. |
230 return <CompilerTask>[irBuilderTask]..addAll(fallbackCompiler.tasks); | 224 return <CompilerTask>[irBuilderTask]..addAll(fallbackCompiler.tasks); |
231 } | 225 } |
232 | 226 |
233 js.Node attachPosition(js.Node node, AstElement element) { | 227 js.Node attachPosition(js.Node node, AstElement element) { |
234 return node.withSourceInformation( | 228 return node.withSourceInformation( |
235 sourceInformationFactory.createBuilderForContext(element) | 229 sourceInformationFactory.createBuilderForContext(element) |
236 .buildDeclaration(element)); | 230 .buildDeclaration(element)); |
237 } | 231 } |
238 } | 232 } |
OLD | NEW |