OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 #include "vm/il_printer.h" | 5 #include "vm/il_printer.h" |
6 | 6 |
7 #include "vm/intermediate_language.h" | 7 #include "vm/intermediate_language.h" |
8 #include "vm/os.h" | 8 #include "vm/os.h" |
9 #include "vm/parser.h" | 9 #include "vm/parser.h" |
10 | 10 |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
70 instr->PrintTo(&f); | 70 instr->PrintTo(&f); |
71 if (FLAG_print_environments && (instr->env() != NULL)) { | 71 if (FLAG_print_environments && (instr->env() != NULL)) { |
72 instr->env()->PrintTo(&f); | 72 instr->env()->PrintTo(&f); |
73 } | 73 } |
74 if (print_locations && (instr->locs() != NULL)) { | 74 if (print_locations && (instr->locs() != NULL)) { |
75 instr->locs()->PrintTo(&f); | 75 instr->locs()->PrintTo(&f); |
76 } | 76 } |
77 if (instr->lifetime_position() != -1) { | 77 if (instr->lifetime_position() != -1) { |
78 OS::Print("%3"Pd": ", instr->lifetime_position()); | 78 OS::Print("%3"Pd": ", instr->lifetime_position()); |
79 } | 79 } |
| 80 if (!instr->IsBlockEntry()) OS::Print(" "); |
80 OS::Print("%s", str); | 81 OS::Print("%s", str); |
81 } | 82 } |
82 | 83 |
83 | 84 |
84 void FlowGraphPrinter::PrintTypeCheck(const ParsedFunction& parsed_function, | 85 void FlowGraphPrinter::PrintTypeCheck(const ParsedFunction& parsed_function, |
85 intptr_t token_pos, | 86 intptr_t token_pos, |
86 Value* value, | 87 Value* value, |
87 const AbstractType& dst_type, | 88 const AbstractType& dst_type, |
88 const String& dst_name, | 89 const String& dst_name, |
89 bool eliminated) { | 90 bool eliminated) { |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
121 } | 122 } |
122 const Class& cls = | 123 const Class& cls = |
123 Class::Handle(Isolate::Current()->class_table()->At(class_ids[k])); | 124 Class::Handle(Isolate::Current()->class_table()->At(class_ids[k])); |
124 f->Print("%s", String::Handle(cls.Name()).ToCString()); | 125 f->Print("%s", String::Handle(cls.Name()).ToCString()); |
125 } | 126 } |
126 } | 127 } |
127 f->Print("]"); | 128 f->Print("]"); |
128 } | 129 } |
129 | 130 |
130 | 131 |
| 132 static void PrintPropagatedType(BufferFormatter* f, const Definition& def) { |
| 133 if (def.HasPropagatedType()) { |
| 134 String& name = String::Handle(); |
| 135 name = AbstractType::Handle(def.PropagatedType()).Name(); |
| 136 f->Print(" {PT: %s}", name.ToCString()); |
| 137 } |
| 138 if (def.has_propagated_cid()) { |
| 139 const Class& cls = Class::Handle( |
| 140 Isolate::Current()->class_table()->At(def.propagated_cid())); |
| 141 f->Print(" {PCid: %s}", String::Handle(cls.Name()).ToCString()); |
| 142 } |
| 143 } |
| 144 |
| 145 |
| 146 static void PrintUse(BufferFormatter* f, const Definition& definition) { |
| 147 if (definition.is_used()) { |
| 148 if (definition.HasSSATemp()) { |
| 149 f->Print("v%"Pd, definition.ssa_temp_index()); |
| 150 } else if (definition.temp_index() != -1) { |
| 151 f->Print("t%"Pd, definition.temp_index()); |
| 152 } |
| 153 } |
| 154 } |
| 155 |
| 156 |
131 void Definition::PrintTo(BufferFormatter* f) const { | 157 void Definition::PrintTo(BufferFormatter* f) const { |
132 // Do not access 'deopt_id()' as it asserts that the computation can | 158 PrintUse(f, *this); |
133 // deoptimize. | 159 if (is_used()) { |
134 if (HasSSATemp()) { | 160 if (HasSSATemp() || (temp_index() != -1)) f->Print(" <- "); |
135 f->Print("v%"Pd" <- ", ssa_temp_index()); | |
136 } | 161 } |
137 f->Print("%s:%"Pd"(", DebugName(), deopt_id_); | 162 f->Print("%s:%"Pd"(", DebugName(), GetDeoptId()); |
138 PrintOperandsTo(f); | 163 PrintOperandsTo(f); |
139 f->Print(")"); | 164 f->Print(")"); |
| 165 PrintPropagatedType(f, *this); |
140 } | 166 } |
141 | 167 |
142 | 168 |
143 void Definition::PrintOperandsTo(BufferFormatter* f) const { | 169 void Definition::PrintOperandsTo(BufferFormatter* f) const { |
144 for (int i = 0; i < InputCount(); ++i) { | 170 for (int i = 0; i < InputCount(); ++i) { |
145 if (i > 0) f->Print(", "); | 171 if (i > 0) f->Print(", "); |
146 if (InputAt(i) != NULL) InputAt(i)->PrintTo(f); | 172 if (InputAt(i) != NULL) InputAt(i)->PrintTo(f); |
147 } | 173 } |
148 } | 174 } |
149 | 175 |
150 | 176 |
151 void Definition::PrintToVisualizer(BufferFormatter* f) const { | 177 void Definition::PrintToVisualizer(BufferFormatter* f) const { |
152 PrintTo(f); | 178 PrintTo(f); |
153 } | 179 } |
154 | 180 |
155 | 181 |
156 void Value::PrintTo(BufferFormatter* f) const { | 182 void Value::PrintTo(BufferFormatter* f) const { |
157 if (definition()->HasSSATemp()) { | 183 PrintUse(f, *definition()); |
158 f->Print("v%"Pd"", definition()->ssa_temp_index()); | |
159 } else { | |
160 f->Print("t%"Pd"", definition()->temp_index()); | |
161 } | |
162 } | 184 } |
163 | 185 |
164 | 186 |
165 void ConstantInstr::PrintOperandsTo(BufferFormatter* f) const { | 187 void ConstantInstr::PrintOperandsTo(BufferFormatter* f) const { |
166 f->Print("#%s", value().ToCString()); | 188 f->Print("#%s", value().ToCString()); |
167 } | 189 } |
168 | 190 |
169 | 191 |
170 void AssertAssignableInstr::PrintOperandsTo(BufferFormatter* f) const { | 192 void AssertAssignableInstr::PrintOperandsTo(BufferFormatter* f) const { |
171 value()->PrintTo(f); | 193 value()->PrintTo(f); |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
209 for (intptr_t i = 0; i < ArgumentCount(); ++i) { | 231 for (intptr_t i = 0; i < ArgumentCount(); ++i) { |
210 f->Print(", "); | 232 f->Print(", "); |
211 ArgumentAt(i)->value()->PrintTo(f); | 233 ArgumentAt(i)->value()->PrintTo(f); |
212 } | 234 } |
213 if (HasICData()) { | 235 if (HasICData()) { |
214 PrintICData(f, *ic_data()); | 236 PrintICData(f, *ic_data()); |
215 } | 237 } |
216 } | 238 } |
217 | 239 |
218 | 240 |
219 void PolymorphicInstanceCallInstr::PrintTo(BufferFormatter* f) const { | 241 void PolymorphicInstanceCallInstr::PrintOperandsTo(BufferFormatter* f) const { |
220 f->Print("%s(", DebugName()); | |
221 instance_call()->PrintOperandsTo(f); | 242 instance_call()->PrintOperandsTo(f); |
222 f->Print(") "); | |
223 PrintICData(f, ic_data()); | 243 PrintICData(f, ic_data()); |
224 } | 244 } |
225 | 245 |
226 | 246 |
227 void StrictCompareInstr::PrintOperandsTo(BufferFormatter* f) const { | 247 void StrictCompareInstr::PrintOperandsTo(BufferFormatter* f) const { |
228 f->Print("%s, ", Token::Str(kind())); | 248 f->Print("%s, ", Token::Str(kind())); |
229 left()->PrintTo(f); | 249 left()->PrintTo(f); |
230 f->Print(", "); | 250 f->Print(", "); |
231 right()->PrintTo(f); | 251 right()->PrintTo(f); |
232 } | 252 } |
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
426 } | 446 } |
427 | 447 |
428 | 448 |
429 void CheckClassInstr::PrintOperandsTo(BufferFormatter* f) const { | 449 void CheckClassInstr::PrintOperandsTo(BufferFormatter* f) const { |
430 value()->PrintTo(f); | 450 value()->PrintTo(f); |
431 PrintICData(f, unary_checks()); | 451 PrintICData(f, unary_checks()); |
432 } | 452 } |
433 | 453 |
434 | 454 |
435 void GraphEntryInstr::PrintTo(BufferFormatter* f) const { | 455 void GraphEntryInstr::PrintTo(BufferFormatter* f) const { |
436 f->Print("%2"Pd": [graph]", block_id()); | 456 f->Print("B%"Pd"[graph]", block_id()); |
437 if (start_env_ != NULL) { | 457 if ((constant_null() != NULL) || (start_env() != NULL)) { |
438 f->Print("\n{\n"); | 458 f->Print(" {"); |
439 const GrowableArray<Value*>& values = start_env_->values(); | 459 if (constant_null() != NULL) { |
440 for (intptr_t i = 0; i < values.length(); i++) { | 460 f->Print("\n "); |
441 Definition* def = values[i]->definition(); | 461 constant_null()->PrintTo(f); |
442 f->Print(" "); | |
443 def->PrintTo(f); | |
444 f->Print("\n"); | |
445 } | 462 } |
446 f->Print("} "); | 463 if (start_env() != NULL) { |
447 start_env_->PrintTo(f); | 464 for (intptr_t i = 0; i < start_env()->values().length(); ++i) { |
| 465 Definition* def = start_env()->values()[i]->definition(); |
| 466 if (def->IsParameter()) { |
| 467 f->Print("\n "); |
| 468 def->PrintTo(f); |
| 469 } |
| 470 } |
| 471 } |
| 472 f->Print("\n}"); |
448 } | 473 } |
449 } | 474 } |
450 | 475 |
451 | 476 |
452 void JoinEntryInstr::PrintTo(BufferFormatter* f) const { | 477 void JoinEntryInstr::PrintTo(BufferFormatter* f) const { |
453 f->Print("%2"Pd": [join]", block_id()); | 478 f->Print("B%"Pd"[join]", block_id()); |
454 if (phis_ != NULL) { | 479 if (phis_ != NULL) { |
| 480 f->Print(" {"); |
455 for (intptr_t i = 0; i < phis_->length(); ++i) { | 481 for (intptr_t i = 0; i < phis_->length(); ++i) { |
456 if ((*phis_)[i] == NULL) continue; | 482 if ((*phis_)[i] == NULL) continue; |
457 f->Print("\n"); | 483 f->Print("\n "); |
458 (*phis_)[i]->PrintTo(f); | 484 (*phis_)[i]->PrintTo(f); |
459 } | 485 } |
| 486 f->Print("\n}"); |
460 } | 487 } |
461 if (HasParallelMove()) { | 488 if (HasParallelMove()) { |
462 f->Print("\n"); | 489 f->Print(" "); |
463 parallel_move()->PrintTo(f); | 490 parallel_move()->PrintTo(f); |
464 } | 491 } |
465 } | 492 } |
466 | 493 |
467 | 494 |
468 static void PrintPropagatedType(BufferFormatter* f, const Definition& def) { | |
469 if (def.HasPropagatedType()) { | |
470 String& name = String::Handle(); | |
471 name = AbstractType::Handle(def.PropagatedType()).Name(); | |
472 f->Print(" {PT: %s}", name.ToCString()); | |
473 } | |
474 if (def.has_propagated_cid()) { | |
475 const Class& cls = Class::Handle( | |
476 Isolate::Current()->class_table()->At(def.propagated_cid())); | |
477 f->Print(" {PCid: %s}", String::Handle(cls.Name()).ToCString()); | |
478 } | |
479 } | |
480 | |
481 | |
482 void PhiInstr::PrintTo(BufferFormatter* f) const { | 495 void PhiInstr::PrintTo(BufferFormatter* f) const { |
483 f->Print(" v%"Pd" <- phi(", ssa_temp_index()); | 496 f->Print("v%"Pd" <- phi(", ssa_temp_index()); |
484 for (intptr_t i = 0; i < inputs_.length(); ++i) { | 497 for (intptr_t i = 0; i < inputs_.length(); ++i) { |
485 if (inputs_[i] != NULL) inputs_[i]->PrintTo(f); | 498 if (inputs_[i] != NULL) inputs_[i]->PrintTo(f); |
486 if (i < inputs_.length() - 1) f->Print(", "); | 499 if (i < inputs_.length() - 1) f->Print(", "); |
487 } | 500 } |
488 f->Print(")"); | 501 f->Print(")"); |
489 PrintPropagatedType(f, *this); | 502 PrintPropagatedType(f, *this); |
490 } | 503 } |
491 | 504 |
492 | 505 |
493 void ParameterInstr::PrintTo(BufferFormatter* f) const { | 506 void ParameterInstr::PrintOperandsTo(BufferFormatter* f) const { |
494 f->Print(" v%"Pd" <- parameter(%"Pd")", | 507 f->Print("%"Pd, index()); |
495 HasSSATemp() ? ssa_temp_index() : temp_index(), | |
496 index()); | |
497 PrintPropagatedType(f, *this); | |
498 } | 508 } |
499 | 509 |
500 | 510 |
501 void TargetEntryInstr::PrintTo(BufferFormatter* f) const { | 511 void TargetEntryInstr::PrintTo(BufferFormatter* f) const { |
502 f->Print("%2"Pd": [target", block_id()); | 512 f->Print("B%"Pd"[target", block_id()); |
503 if (IsCatchEntry()) { | 513 if (IsCatchEntry()) { |
504 f->Print(" catch %"Pd"]", catch_try_index()); | 514 f->Print(" catch %"Pd"]", catch_try_index()); |
505 } else { | 515 } else { |
506 f->Print("]"); | 516 f->Print("]"); |
507 } | 517 } |
508 if (HasParallelMove()) { | 518 if (HasParallelMove()) { |
509 f->Print("\n"); | 519 f->Print(" "); |
510 parallel_move()->PrintTo(f); | 520 parallel_move()->PrintTo(f); |
511 } | 521 } |
512 } | 522 } |
513 | 523 |
514 | 524 |
515 void PushArgumentInstr::PrintTo(BufferFormatter* f) const { | 525 void PushArgumentInstr::PrintOperandsTo(BufferFormatter* f) const { |
516 f->Print(" %s ", DebugName()); | |
517 value()->PrintTo(f); | 526 value()->PrintTo(f); |
518 } | 527 } |
519 | 528 |
520 | 529 |
521 void ReturnInstr::PrintTo(BufferFormatter* f) const { | 530 void ReturnInstr::PrintTo(BufferFormatter* f) const { |
522 f->Print(" %s ", DebugName()); | 531 f->Print("%s ", DebugName()); |
523 value()->PrintTo(f); | 532 value()->PrintTo(f); |
524 } | 533 } |
525 | 534 |
526 | 535 |
527 void ThrowInstr::PrintTo(BufferFormatter* f) const { | 536 void ThrowInstr::PrintTo(BufferFormatter* f) const { |
528 f->Print(" %s" , DebugName()); | 537 f->Print("%s" , DebugName()); |
529 } | 538 } |
530 | 539 |
531 | 540 |
532 void ReThrowInstr::PrintTo(BufferFormatter* f) const { | 541 void ReThrowInstr::PrintTo(BufferFormatter* f) const { |
533 f->Print(" %s ", DebugName()); | 542 f->Print("%s ", DebugName()); |
534 } | 543 } |
535 | 544 |
536 | 545 |
537 void GotoInstr::PrintTo(BufferFormatter* f) const { | 546 void GotoInstr::PrintTo(BufferFormatter* f) const { |
538 if (HasParallelMove()) { | 547 if (HasParallelMove()) { |
539 parallel_move()->PrintTo(f); | 548 parallel_move()->PrintTo(f); |
540 } else { | 549 f->Print(" "); |
541 f->Print(" "); | |
542 } | 550 } |
543 f->Print(" goto:%"Pd" %"Pd"", GetDeoptId(), successor()->block_id()); | 551 f->Print("goto:%"Pd" %"Pd"", GetDeoptId(), successor()->block_id()); |
544 } | 552 } |
545 | 553 |
546 | 554 |
547 void BranchInstr::PrintTo(BufferFormatter* f) const { | 555 void BranchInstr::PrintTo(BufferFormatter* f) const { |
548 f->Print(" %s ", DebugName()); | 556 f->Print("%s ", DebugName()); |
549 f->Print("if "); | 557 f->Print("if "); |
550 comparison()->PrintTo(f); | 558 comparison()->PrintTo(f); |
551 | 559 |
552 f->Print(" goto (%"Pd", %"Pd")", | 560 f->Print(" goto (%"Pd", %"Pd")", |
553 true_successor()->block_id(), | 561 true_successor()->block_id(), |
554 false_successor()->block_id()); | 562 false_successor()->block_id()); |
555 } | 563 } |
556 | 564 |
557 | 565 |
558 void ParallelMoveInstr::PrintTo(BufferFormatter* f) const { | 566 void ParallelMoveInstr::PrintTo(BufferFormatter* f) const { |
559 f->Print(" %s ", DebugName()); | 567 f->Print("%s ", DebugName()); |
560 for (intptr_t i = 0; i < moves_.length(); i++) { | 568 for (intptr_t i = 0; i < moves_.length(); i++) { |
561 if (i != 0) f->Print(", "); | 569 if (i != 0) f->Print(", "); |
562 moves_[i]->dest().PrintTo(f); | 570 moves_[i]->dest().PrintTo(f); |
563 f->Print(" <- "); | 571 f->Print(" <- "); |
564 moves_[i]->src().PrintTo(f); | 572 moves_[i]->src().PrintTo(f); |
565 } | 573 } |
566 } | 574 } |
567 | 575 |
568 | 576 |
569 void FlowGraphVisualizer::Print(const char* format, ...) { | 577 void FlowGraphVisualizer::Print(const char* format, ...) { |
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
792 if ((locations_ != NULL) && !locations_[i].IsInvalid()) { | 800 if ((locations_ != NULL) && !locations_[i].IsInvalid()) { |
793 f->Print(" ["); | 801 f->Print(" ["); |
794 locations_[i].PrintTo(f); | 802 locations_[i].PrintTo(f); |
795 f->Print("]"); | 803 f->Print("]"); |
796 } | 804 } |
797 } | 805 } |
798 f->Print(" }"); | 806 f->Print(" }"); |
799 } | 807 } |
800 | 808 |
801 } // namespace dart | 809 } // namespace dart |
OLD | NEW |