Index: pkg/compiler/lib/src/ssa/builder_kernel.dart |
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart |
index 5c82e26af290c5a9a171d9803643963b1b098197..1f338dcfdd1a1fe6d3feaf77d4096416fbf0e035 100644 |
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart |
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart |
@@ -2,15 +2,18 @@ |
// 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 ir; |
+ |
import '../common/codegen.dart' show CodegenWorkItem; |
import '../common/tasks.dart' show CompilerTask; |
+import '../compiler.dart'; |
import '../elements/elements.dart'; |
import '../io/source_information.dart'; |
-import '../js_backend/backend.dart' show JavaScriptBackend, FunctionCompiler; |
+import '../js_backend/backend.dart' show JavaScriptBackend; |
import '../kernel/kernel.dart'; |
import '../kernel/kernel_visitor.dart'; |
import '../resolution/tree_elements.dart'; |
- |
+import 'graph_builder.dart'; |
import 'nodes.dart'; |
class SsaKernelBuilderTask extends CompilerTask { |
@@ -32,10 +35,60 @@ class SsaKernelBuilderTask extends CompilerTask { |
IrFunction function; |
try { |
function = visitor.buildFunction(); |
- } catch(e) { |
+ } catch (e) { |
throw "Failed to convert to Kernel IR: $e"; |
} |
- throw "Successfully converted to Kernel IR: $function"; |
+ KernelSsaBuilder builder = |
+ new KernelSsaBuilder(function, element, backend.compiler); |
+ return builder.build(); |
}); |
} |
} |
+ |
+// DESIGN NOTE: I am implementing this by essentially copying the methods in |
+// [SsaBuilder], but trying to use Kernel IR instead of our AST nodes. In places |
+// where there is functionality in the [SsaBuilder] that is not yet needed in |
+// this builder, I am adding a comment that tells what the [SsaBuilder] does at |
+// that location. |
+class KernelSsaBuilder extends ir.Visitor with GraphBuilder { |
+ final IrFunction function; |
+ final FunctionElement functionElement; |
+ final Compiler compiler; |
+ |
+ KernelSsaBuilder(this.function, this.functionElement, this.compiler); |
+ |
+ HGraph build() { |
+ if (function.kind == ir.ProcedureKind.Method) { |
+ buildMethod(function); |
+ } else { |
+ compiler.reporter.internalError( |
+ functionElement, |
+ "Unable to convert this kind of Kernel " |
+ "procedure to SSA: ${function.kind}"); |
+ } |
+ assert(graph.isValid()); |
+ return graph; |
+ } |
+ |
+ /// Builds a SSA graph for [method]. |
+ void buildMethod(IrFunction method) { |
+ // TODO(het): Determine whether or not this method is called in a loop and |
+ // set [graph.isCalledInLoop]. |
+ openFunction(method); |
+ } |
+ |
+ void openFunction(IrFunction method) { |
+ HBasicBlock block = graph.addNewBlock(); |
+ open(graph.entry); |
+ // TODO(het): Register parameters with a locals handler |
+ close(new HGoto()).addSuccessor(block); |
+ |
+ open(block); |
+ |
+ // TODO(het): If this is a constructor then add the type parameters of the |
+ // enclosing class as parameters to the method. This must be done before |
+ // adding normal parameters because their types may contain references to |
+ // the class type parameters. |
+ |
+ } |
+} |