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 library dart2js.ir_tracer; | 5 library dart2js.ir_tracer; |
6 | 6 |
7 import 'dart:async' show EventSink; | 7 import 'dart:async' show EventSink; |
8 | 8 |
9 import 'cps_ir_nodes.dart' as cps_ir hide Function; | 9 import 'cps_ir_nodes.dart' as cps_ir hide Function; |
10 import '../tracer.dart'; | 10 import '../tracer.dart'; |
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
192 visitBranch(cps_ir.Branch node) { | 192 visitBranch(cps_ir.Branch node) { |
193 String dummy = names.name(node); | 193 String dummy = names.name(node); |
194 String condition = visit(node.condition); | 194 String condition = visit(node.condition); |
195 String trueCont = formatReference(node.trueContinuation); | 195 String trueCont = formatReference(node.trueContinuation); |
196 String falseCont = formatReference(node.falseContinuation); | 196 String falseCont = formatReference(node.falseContinuation); |
197 printStmt(dummy, "Branch $condition ($trueCont, $falseCont)"); | 197 printStmt(dummy, "Branch $condition ($trueCont, $falseCont)"); |
198 } | 198 } |
199 | 199 |
200 visitSetClosureVariable(cps_ir.SetClosureVariable node) { | 200 visitSetClosureVariable(cps_ir.SetClosureVariable node) { |
201 String dummy = names.name(node); | 201 String dummy = names.name(node); |
202 String variable = node.variable.name; | 202 String variable = names.name(node.variable.definition); |
203 String value = formatReference(node.value); | 203 String value = formatReference(node.value); |
204 printStmt(dummy, 'SetClosureVariable $variable = $value'); | 204 printStmt(dummy, 'SetClosureVariable $variable = $value'); |
205 visit(node.body); | 205 visit(node.body); |
206 } | 206 } |
207 | 207 |
208 visitDeclareFunction(cps_ir.DeclareFunction node) { | 208 visitDeclareFunction(cps_ir.DeclareFunction node) { |
209 String dummy = names.name(node); | 209 String dummy = names.name(node); |
210 String variable = node.variable.name; | 210 String variable = names.name(node.variable.definition); |
211 printStmt(dummy, 'DeclareFunction $variable'); | 211 printStmt(dummy, 'DeclareFunction $variable'); |
212 visit(node.body); | 212 visit(node.body); |
213 } | 213 } |
214 | 214 |
215 String formatReference(cps_ir.Reference ref) { | 215 String formatReference(cps_ir.Reference ref) { |
216 cps_ir.Definition target = ref.definition; | 216 cps_ir.Definition target = ref.definition; |
217 if (target is cps_ir.Continuation && target.isReturnContinuation) { | 217 if (target is cps_ir.Continuation && target.isReturnContinuation) { |
218 return "return"; // Do not generate a name for the return continuation | 218 return "return"; // Do not generate a name for the return continuation |
219 } else { | 219 } else { |
220 return names.name(ref.definition); | 220 return names.name(ref.definition); |
221 } | 221 } |
222 } | 222 } |
223 | 223 |
224 String formatPrimitive(cps_ir.Primitive p) => visit(p); | 224 String formatPrimitive(cps_ir.Primitive p) => visit(p); |
225 | 225 |
226 visitConstant(cps_ir.Constant node) { | 226 visitConstant(cps_ir.Constant node) { |
227 return "Constant ${node.expression.value.toStructuredString()}"; | 227 return "Constant ${node.expression.value.toStructuredString()}"; |
228 } | 228 } |
229 | 229 |
230 visitParameter(cps_ir.Parameter node) { | 230 visitParameter(cps_ir.Parameter node) { |
231 return "Parameter ${names.name(node)}"; | 231 return "Parameter ${names.name(node)}"; |
232 } | 232 } |
233 | 233 |
| 234 visitClosureVariable(cps_ir.ClosureVariable node) { |
| 235 return "ClosureVariable ${names.name(node)}"; |
| 236 } |
| 237 |
234 visitContinuation(cps_ir.Continuation node) { | 238 visitContinuation(cps_ir.Continuation node) { |
235 return "Continuation ${names.name(node)}"; | 239 return "Continuation ${names.name(node)}"; |
236 } | 240 } |
237 | 241 |
238 visitIsTrue(cps_ir.IsTrue node) { | 242 visitIsTrue(cps_ir.IsTrue node) { |
239 return "IsTrue(${names.name(node.value.definition)})"; | 243 return "IsTrue(${names.name(node.value.definition)})"; |
240 } | 244 } |
241 | 245 |
242 visitIdentical(cps_ir.Identical node) { | 246 visitIdentical(cps_ir.Identical node) { |
243 String left = formatReference(node.left); | 247 String left = formatReference(node.left); |
244 String right = formatReference(node.right); | 248 String right = formatReference(node.right); |
245 return "Identical($left, $right)"; | 249 return "Identical($left, $right)"; |
246 } | 250 } |
247 | 251 |
248 visitThis(cps_ir.This node) { | 252 visitThis(cps_ir.This node) { |
249 return "This"; | 253 return "This"; |
250 } | 254 } |
251 | 255 |
252 visitReifyTypeVar(cps_ir.ReifyTypeVar node) { | 256 visitReifyTypeVar(cps_ir.ReifyTypeVar node) { |
253 return "ReifyTypeVar ${node.typeVariable.name}"; | 257 return "ReifyTypeVar ${node.typeVariable.name}"; |
254 } | 258 } |
255 | 259 |
256 visitCreateFunction(cps_ir.CreateFunction node) { | 260 visitCreateFunction(cps_ir.CreateFunction node) { |
257 return "CreateFunction ${node.definition.element.name}"; | 261 return "CreateFunction ${node.definition.element.name}"; |
258 } | 262 } |
259 | 263 |
260 visitGetClosureVariable(cps_ir.GetClosureVariable node) { | 264 visitGetClosureVariable(cps_ir.GetClosureVariable node) { |
261 String variable = node.variable.name; | 265 String variable = names.name(node.variable.definition); |
262 return 'GetClosureVariable $variable'; | 266 return 'GetClosureVariable $variable'; |
263 } | 267 } |
264 | 268 |
265 | 269 |
266 visitCondition(cps_ir.Condition c) {} | 270 visitCondition(cps_ir.Condition c) {} |
267 visitExpression(cps_ir.Expression e) {} | 271 visitExpression(cps_ir.Expression e) {} |
268 visitPrimitive(cps_ir.Primitive p) {} | 272 visitPrimitive(cps_ir.Primitive p) {} |
269 visitDefinition(cps_ir.Definition d) {} | 273 visitDefinition(cps_ir.Definition d) {} |
270 visitNode(cps_ir.Node n) {} | 274 visitNode(cps_ir.Node n) {} |
271 } | 275 } |
272 | 276 |
273 /** | 277 /** |
274 * Invents (and remembers) names for Continuations, Parameters, etc. | 278 * Invents (and remembers) names for Continuations, Parameters, etc. |
275 * The names must match the conventions used by IR Hydra, e.g. | 279 * The names must match the conventions used by IR Hydra, e.g. |
276 * Continuations and Functions must have names of form B### since they | 280 * Continuations and Functions must have names of form B### since they |
277 * are visualized as basic blocks. | 281 * are visualized as basic blocks. |
278 */ | 282 */ |
279 class Names { | 283 class Names { |
280 final Map<Object, String> names = {}; | 284 final Map<Object, String> names = {}; |
281 final Map<String, int> counters = { | 285 final Map<String, int> counters = { |
282 'r': 0, | 286 'r': 0, |
283 'B': 0, | 287 'B': 0, |
284 'v': 0, | 288 'v': 0, |
285 'x': 0 | 289 'x': 0, |
| 290 'c': 0 |
286 }; | 291 }; |
287 | 292 |
288 String prefix(x) { | 293 String prefix(x) { |
289 if (x is cps_ir.Parameter) return 'r'; | 294 if (x is cps_ir.Parameter) return 'r'; |
290 if (x is cps_ir.Continuation || x is cps_ir.FunctionDefinition) return 'B'; | 295 if (x is cps_ir.Continuation || x is cps_ir.FunctionDefinition) return 'B'; |
291 if (x is cps_ir.Primitive) return 'v'; | 296 if (x is cps_ir.Primitive) return 'v'; |
| 297 if (x is cps_ir.ClosureVariable) return 'c'; |
292 return 'x'; | 298 return 'x'; |
293 } | 299 } |
294 | 300 |
295 String name(x) { | 301 String name(x) { |
296 String nam = names[x]; | 302 String nam = names[x]; |
297 if (nam == null) { | 303 if (nam == null) { |
298 String pref = prefix(x); | 304 String pref = prefix(x); |
299 int id = counters[pref]++; | 305 int id = counters[pref]++; |
300 nam = names[x] = '${pref}${id}'; | 306 nam = names[x] = '${pref}${id}'; |
301 } | 307 } |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
409 } | 415 } |
410 } | 416 } |
411 | 417 |
412 visitContinuation(cps_ir.Continuation c) { | 418 visitContinuation(cps_ir.Continuation c) { |
413 var old_node = current_block; | 419 var old_node = current_block; |
414 current_block = getBlock(c); | 420 current_block = getBlock(c); |
415 visit(c.body); | 421 visit(c.body); |
416 current_block = old_node; | 422 current_block = old_node; |
417 } | 423 } |
418 } | 424 } |
OLD | NEW |