| 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/flow_graph_range_analysis.h" | 7 #include "vm/flow_graph_range_analysis.h" |
| 8 #include "vm/intermediate_language.h" | 8 #include "vm/intermediate_language.h" |
| 9 #include "vm/os.h" | 9 #include "vm/os.h" |
| 10 #include "vm/parser.h" | 10 #include "vm/parser.h" |
| 11 | 11 |
| 12 namespace dart { | 12 namespace dart { |
| 13 | 13 |
| 14 #ifndef PRODUCT | 14 #ifndef PRODUCT |
| 15 | 15 |
| 16 DEFINE_FLAG(bool, display_sorted_ic_data, false, | 16 DEFINE_FLAG(bool, |
| 17 "Calls display a unary, sorted-by count form of ICData"); | 17 display_sorted_ic_data, |
| 18 false, |
| 19 "Calls display a unary, sorted-by count form of ICData"); |
| 18 DEFINE_FLAG(bool, print_environments, false, "Print SSA environments."); | 20 DEFINE_FLAG(bool, print_environments, false, "Print SSA environments."); |
| 19 DEFINE_FLAG(charp, print_flow_graph_filter, NULL, | 21 DEFINE_FLAG(charp, |
| 20 "Print only IR of functions with matching names"); | 22 print_flow_graph_filter, |
| 23 NULL, |
| 24 "Print only IR of functions with matching names"); |
| 21 | 25 |
| 22 DECLARE_FLAG(bool, trace_inlining_intervals); | 26 DECLARE_FLAG(bool, trace_inlining_intervals); |
| 23 | 27 |
| 24 void BufferFormatter::Print(const char* format, ...) { | 28 void BufferFormatter::Print(const char* format, ...) { |
| 25 va_list args; | 29 va_list args; |
| 26 va_start(args, format); | 30 va_start(args, format); |
| 27 VPrint(format, args); | 31 VPrint(format, args); |
| 28 va_end(args); | 32 va_end(args); |
| 29 } | 33 } |
| 30 | 34 |
| 31 | 35 |
| 32 void BufferFormatter::VPrint(const char* format, va_list args) { | 36 void BufferFormatter::VPrint(const char* format, va_list args) { |
| 33 intptr_t available = size_ - position_; | 37 intptr_t available = size_ - position_; |
| 34 if (available <= 0) return; | 38 if (available <= 0) return; |
| 35 intptr_t written = | 39 intptr_t written = OS::VSNPrint(buffer_ + position_, available, format, args); |
| 36 OS::VSNPrint(buffer_ + position_, available, format, args); | |
| 37 if (written >= 0) { | 40 if (written >= 0) { |
| 38 position_ += (available <= written) ? available : written; | 41 position_ += (available <= written) ? available : written; |
| 39 } | 42 } |
| 40 } | 43 } |
| 41 | 44 |
| 42 | 45 |
| 43 // Checks whether function's name matches the given filter, which is | 46 // Checks whether function's name matches the given filter, which is |
| 44 // a comma-separated list of strings. | 47 // a comma-separated list of strings. |
| 45 bool FlowGraphPrinter::PassesFilter(const char* filter, | 48 bool FlowGraphPrinter::PassesFilter(const char* filter, |
| 46 const Function& function) { | 49 const Function& function) { |
| (...skipping 11 matching lines...) Expand all Loading... |
| 58 char* token = strtok_r(filter_buffer, ",", &save_ptr); | 61 char* token = strtok_r(filter_buffer, ",", &save_ptr); |
| 59 bool found = false; | 62 bool found = false; |
| 60 while (token != NULL) { | 63 while (token != NULL) { |
| 61 if (strstr(function_name, token) != NULL) { | 64 if (strstr(function_name, token) != NULL) { |
| 62 found = true; | 65 found = true; |
| 63 break; | 66 break; |
| 64 } | 67 } |
| 65 const intptr_t token_len = strlen(token); | 68 const intptr_t token_len = strlen(token); |
| 66 if (token[token_len - 1] == '%') { | 69 if (token[token_len - 1] == '%') { |
| 67 if (function_name_len > token_len) { | 70 if (function_name_len > token_len) { |
| 68 const char* suffix = function_name + | 71 const char* suffix = |
| 69 (function_name_len - token_len + 1); | 72 function_name + (function_name_len - token_len + 1); |
| 70 if (strncmp(suffix, token, token_len - 1) == 0) { | 73 if (strncmp(suffix, token, token_len - 1) == 0) { |
| 71 found = true; | 74 found = true; |
| 72 break; | 75 break; |
| 73 } | 76 } |
| 74 } | 77 } |
| 75 } | 78 } |
| 76 token = strtok_r(NULL, ",", &save_ptr); | 79 token = strtok_r(NULL, ",", &save_ptr); |
| 77 } | 80 } |
| 78 delete[] filter_buffer; | 81 delete[] filter_buffer; |
| 79 | 82 |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 147 } | 150 } |
| 148 } | 151 } |
| 149 | 152 |
| 150 | 153 |
| 151 void FlowGraphPrinter::PrintTypeCheck(const ParsedFunction& parsed_function, | 154 void FlowGraphPrinter::PrintTypeCheck(const ParsedFunction& parsed_function, |
| 152 TokenPosition token_pos, | 155 TokenPosition token_pos, |
| 153 Value* value, | 156 Value* value, |
| 154 const AbstractType& dst_type, | 157 const AbstractType& dst_type, |
| 155 const String& dst_name, | 158 const String& dst_name, |
| 156 bool eliminated) { | 159 bool eliminated) { |
| 157 const char* compile_type_name = "unknown"; | 160 const char* compile_type_name = "unknown"; |
| 158 if (value != NULL && value->reaching_type_ != NULL) { | 161 if (value != NULL && value->reaching_type_ != NULL) { |
| 159 compile_type_name = value->reaching_type_->ToCString(); | 162 compile_type_name = value->reaching_type_->ToCString(); |
| 160 } | 163 } |
| 161 THR_Print("%s type check: compile type %s is %s specific than " | 164 THR_Print( |
| 162 "type '%s' of '%s'.\n", | 165 "%s type check: compile type %s is %s specific than " |
| 163 eliminated ? "Eliminated" : "Generated", | 166 "type '%s' of '%s'.\n", |
| 164 compile_type_name, | 167 eliminated ? "Eliminated" : "Generated", compile_type_name, |
| 165 eliminated ? "more" : "not more", | 168 eliminated ? "more" : "not more", |
| 166 String::Handle(dst_type.Name()).ToCString(), | 169 String::Handle(dst_type.Name()).ToCString(), dst_name.ToCString()); |
| 167 dst_name.ToCString()); | |
| 168 } | 170 } |
| 169 | 171 |
| 170 | 172 |
| 171 void CompileType::PrintTo(BufferFormatter* f) const { | 173 void CompileType::PrintTo(BufferFormatter* f) const { |
| 172 const char* type_name = "?"; | 174 const char* type_name = "?"; |
| 173 if ((cid_ != kIllegalCid) && (cid_ != kDynamicCid)) { | 175 if ((cid_ != kIllegalCid) && (cid_ != kDynamicCid)) { |
| 174 const Class& cls = | 176 const Class& cls = |
| 175 Class::Handle(Isolate::Current()->class_table()->At(cid_)); | 177 Class::Handle(Isolate::Current()->class_table()->At(cid_)); |
| 176 type_name = String::Handle(cls.ScrubbedName()).ToCString(); | 178 type_name = String::Handle(cls.ScrubbedName()).ToCString(); |
| 177 } else if (type_ != NULL && | 179 } else if (type_ != NULL && |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 224 f->Print("..."); | 226 f->Print("..."); |
| 225 } | 227 } |
| 226 f->Print("]"); | 228 f->Print("]"); |
| 227 } | 229 } |
| 228 | 230 |
| 229 | 231 |
| 230 static void PrintICDataSortedHelper(BufferFormatter* f, | 232 static void PrintICDataSortedHelper(BufferFormatter* f, |
| 231 const ICData& ic_data_orig) { | 233 const ICData& ic_data_orig) { |
| 232 const ICData& ic_data = | 234 const ICData& ic_data = |
| 233 ICData::Handle(ic_data_orig.AsUnaryClassChecksSortedByCount()); | 235 ICData::Handle(ic_data_orig.AsUnaryClassChecksSortedByCount()); |
| 234 f->Print(" IC[n:%" Pd"; ", ic_data.NumberOfChecks()); | 236 f->Print(" IC[n:%" Pd "; ", ic_data.NumberOfChecks()); |
| 235 for (intptr_t i = 0; i < ic_data.NumberOfChecks(); i++) { | 237 for (intptr_t i = 0; i < ic_data.NumberOfChecks(); i++) { |
| 236 const intptr_t count = ic_data.GetCountAt(i); | 238 const intptr_t count = ic_data.GetCountAt(i); |
| 237 const intptr_t cid = ic_data.GetReceiverClassIdAt(i); | 239 const intptr_t cid = ic_data.GetReceiverClassIdAt(i); |
| 238 const Class& cls = | 240 const Class& cls = |
| 239 Class::Handle(Isolate::Current()->class_table()->At(cid)); | 241 Class::Handle(Isolate::Current()->class_table()->At(cid)); |
| 240 f->Print("%s : %" Pd ", ", | 242 f->Print("%s : %" Pd ", ", String::Handle(cls.Name()).ToCString(), count); |
| 241 String::Handle(cls.Name()).ToCString(), count); | |
| 242 } | 243 } |
| 243 f->Print("]"); | 244 f->Print("]"); |
| 244 } | 245 } |
| 245 | 246 |
| 246 | 247 |
| 247 void FlowGraphPrinter::PrintICData(const ICData& ic_data, | 248 void FlowGraphPrinter::PrintICData(const ICData& ic_data, |
| 248 intptr_t num_checks_to_print) { | 249 intptr_t num_checks_to_print) { |
| 249 char buffer[1024]; | 250 char buffer[1024]; |
| 250 BufferFormatter f(buffer, sizeof(buffer)); | 251 BufferFormatter f(buffer, sizeof(buffer)); |
| 251 PrintICDataHelper(&f, ic_data, num_checks_to_print); | 252 PrintICDataHelper(&f, ic_data, num_checks_to_print); |
| 252 THR_Print("%s ", buffer); | 253 THR_Print("%s ", buffer); |
| 253 const Array& a = Array::Handle(ic_data.arguments_descriptor()); | 254 const Array& a = Array::Handle(ic_data.arguments_descriptor()); |
| 254 THR_Print(" arg-desc %" Pd "\n", a.Length()); | 255 THR_Print(" arg-desc %" Pd "\n", a.Length()); |
| 255 } | 256 } |
| 256 | 257 |
| 257 | 258 |
| 258 static void PrintUse(BufferFormatter* f, const Definition& definition) { | 259 static void PrintUse(BufferFormatter* f, const Definition& definition) { |
| 259 if (definition.HasSSATemp()) { | 260 if (definition.HasSSATemp()) { |
| 260 if (definition.HasPairRepresentation()) { | 261 if (definition.HasPairRepresentation()) { |
| 261 f->Print("(v%" Pd ", v%" Pd ")", definition.ssa_temp_index(), | 262 f->Print("(v%" Pd ", v%" Pd ")", definition.ssa_temp_index(), |
| 262 definition.ssa_temp_index() + 1); | 263 definition.ssa_temp_index() + 1); |
| 263 } else { | 264 } else { |
| 264 f->Print("v%" Pd "", definition.ssa_temp_index()); | 265 f->Print("v%" Pd "", definition.ssa_temp_index()); |
| 265 } | 266 } |
| 266 } else if (definition.HasTemp()) { | 267 } else if (definition.HasTemp()) { |
| 267 f->Print("t%" Pd "", definition.temp_index()); | 268 f->Print("t%" Pd "", definition.temp_index()); |
| 268 } | 269 } |
| 269 } | 270 } |
| 270 | 271 |
| 271 | 272 |
| 272 const char* Instruction::ToCString() const { | 273 const char* Instruction::ToCString() const { |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 325 if (InputAt(i) != NULL) { | 326 if (InputAt(i) != NULL) { |
| 326 InputAt(i)->PrintTo(f); | 327 InputAt(i)->PrintTo(f); |
| 327 } | 328 } |
| 328 } | 329 } |
| 329 } | 330 } |
| 330 | 331 |
| 331 | 332 |
| 332 void Value::PrintTo(BufferFormatter* f) const { | 333 void Value::PrintTo(BufferFormatter* f) const { |
| 333 PrintUse(f, *definition()); | 334 PrintUse(f, *definition()); |
| 334 | 335 |
| 335 if ((reaching_type_ != NULL) && | 336 if ((reaching_type_ != NULL) && (reaching_type_ != definition()->type_)) { |
| 336 (reaching_type_ != definition()->type_)) { | |
| 337 f->Print(" "); | 337 f->Print(" "); |
| 338 reaching_type_->PrintTo(f); | 338 reaching_type_->PrintTo(f); |
| 339 } | 339 } |
| 340 } | 340 } |
| 341 | 341 |
| 342 | 342 |
| 343 void ConstantInstr::PrintOperandsTo(BufferFormatter* f) const { | 343 void ConstantInstr::PrintOperandsTo(BufferFormatter* f) const { |
| 344 const char* cstr = value().ToCString(); | 344 const char* cstr = value().ToCString(); |
| 345 const char* new_line = strchr(cstr, '\n'); | 345 const char* new_line = strchr(cstr, '\n'); |
| 346 if (new_line == NULL) { | 346 if (new_line == NULL) { |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 416 f->Print("%" Pd "", num_temps()); | 416 f->Print("%" Pd "", num_temps()); |
| 417 if (value() != NULL) { | 417 if (value() != NULL) { |
| 418 f->Print(", "); | 418 f->Print(", "); |
| 419 value()->PrintTo(f); | 419 value()->PrintTo(f); |
| 420 } | 420 } |
| 421 } | 421 } |
| 422 | 422 |
| 423 | 423 |
| 424 void AssertAssignableInstr::PrintOperandsTo(BufferFormatter* f) const { | 424 void AssertAssignableInstr::PrintOperandsTo(BufferFormatter* f) const { |
| 425 value()->PrintTo(f); | 425 value()->PrintTo(f); |
| 426 f->Print(", %s, '%s'", | 426 f->Print(", %s, '%s'", dst_type().ToCString(), dst_name().ToCString()); |
| 427 dst_type().ToCString(), | |
| 428 dst_name().ToCString()); | |
| 429 f->Print(" instantiator_type_arguments("); | 427 f->Print(" instantiator_type_arguments("); |
| 430 instantiator_type_arguments()->PrintTo(f); | 428 instantiator_type_arguments()->PrintTo(f); |
| 431 f->Print(")"); | 429 f->Print(")"); |
| 432 } | 430 } |
| 433 | 431 |
| 434 | 432 |
| 435 void AssertBooleanInstr::PrintOperandsTo(BufferFormatter* f) const { | 433 void AssertBooleanInstr::PrintOperandsTo(BufferFormatter* f) const { |
| 436 value()->PrintTo(f); | 434 value()->PrintTo(f); |
| 437 } | 435 } |
| 438 | 436 |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 491 if (needs_number_check()) { | 489 if (needs_number_check()) { |
| 492 f->Print(", with number check"); | 490 f->Print(", with number check"); |
| 493 } | 491 } |
| 494 } | 492 } |
| 495 | 493 |
| 496 | 494 |
| 497 void TestCidsInstr::PrintOperandsTo(BufferFormatter* f) const { | 495 void TestCidsInstr::PrintOperandsTo(BufferFormatter* f) const { |
| 498 left()->PrintTo(f); | 496 left()->PrintTo(f); |
| 499 f->Print(" %s [", Token::Str(kind())); | 497 f->Print(" %s [", Token::Str(kind())); |
| 500 for (intptr_t i = 0; i < cid_results().length(); i += 2) { | 498 for (intptr_t i = 0; i < cid_results().length(); i += 2) { |
| 501 f->Print("0x%" Px ":%s ", | 499 f->Print("0x%" Px ":%s ", cid_results()[i], |
| 502 cid_results()[i], cid_results()[i + 1] == 0 ? "false" : "true"); | 500 cid_results()[i + 1] == 0 ? "false" : "true"); |
| 503 } | 501 } |
| 504 f->Print("] "); | 502 f->Print("] "); |
| 505 } | 503 } |
| 506 | 504 |
| 507 | 505 |
| 508 void EqualityCompareInstr::PrintOperandsTo(BufferFormatter* f) const { | 506 void EqualityCompareInstr::PrintOperandsTo(BufferFormatter* f) const { |
| 509 left()->PrintTo(f); | 507 left()->PrintTo(f); |
| 510 f->Print(" %s ", Token::Str(kind())); | 508 f->Print(" %s ", Token::Str(kind())); |
| 511 right()->PrintTo(f); | 509 right()->PrintTo(f); |
| 512 } | 510 } |
| (...skipping 18 matching lines...) Expand all Loading... |
| 531 value()->PrintTo(f); | 529 value()->PrintTo(f); |
| 532 } | 530 } |
| 533 | 531 |
| 534 | 532 |
| 535 void NativeCallInstr::PrintOperandsTo(BufferFormatter* f) const { | 533 void NativeCallInstr::PrintOperandsTo(BufferFormatter* f) const { |
| 536 f->Print("%s", native_name().ToCString()); | 534 f->Print("%s", native_name().ToCString()); |
| 537 } | 535 } |
| 538 | 536 |
| 539 | 537 |
| 540 void GuardFieldInstr::PrintOperandsTo(BufferFormatter* f) const { | 538 void GuardFieldInstr::PrintOperandsTo(BufferFormatter* f) const { |
| 541 f->Print("%s %s, ", | 539 f->Print("%s %s, ", String::Handle(field().name()).ToCString(), |
| 542 String::Handle(field().name()).ToCString(), | |
| 543 field().GuardedPropertiesAsCString()); | 540 field().GuardedPropertiesAsCString()); |
| 544 value()->PrintTo(f); | 541 value()->PrintTo(f); |
| 545 } | 542 } |
| 546 | 543 |
| 547 | 544 |
| 548 void StoreInstanceFieldInstr::PrintOperandsTo(BufferFormatter* f) const { | 545 void StoreInstanceFieldInstr::PrintOperandsTo(BufferFormatter* f) const { |
| 549 if (field().IsNull()) { | 546 if (field().IsNull()) { |
| 550 f->Print("{%" Pd "}, ", offset_in_bytes()); | 547 f->Print("{%" Pd "}, ", offset_in_bytes()); |
| 551 } else { | 548 } else { |
| 552 f->Print("%s {%" Pd "}, ", | 549 f->Print("%s {%" Pd "}, ", String::Handle(field().name()).ToCString(), |
| 553 String::Handle(field().name()).ToCString(), | |
| 554 field().Offset()); | 550 field().Offset()); |
| 555 } | 551 } |
| 556 instance()->PrintTo(f); | 552 instance()->PrintTo(f); |
| 557 f->Print(", "); | 553 f->Print(", "); |
| 558 value()->PrintTo(f); | 554 value()->PrintTo(f); |
| 559 } | 555 } |
| 560 | 556 |
| 561 | 557 |
| 562 void IfThenElseInstr::PrintOperandsTo(BufferFormatter* f) const { | 558 void IfThenElseInstr::PrintOperandsTo(BufferFormatter* f) const { |
| 563 comparison()->PrintOperandsTo(f); | 559 comparison()->PrintOperandsTo(f); |
| 564 f->Print(" ? %" Pd " : %" Pd, | 560 f->Print(" ? %" Pd " : %" Pd, if_true_, if_false_); |
| 565 if_true_, | |
| 566 if_false_); | |
| 567 } | 561 } |
| 568 | 562 |
| 569 | 563 |
| 570 void LoadStaticFieldInstr::PrintOperandsTo(BufferFormatter* f) const { | 564 void LoadStaticFieldInstr::PrintOperandsTo(BufferFormatter* f) const { |
| 571 field_value()->PrintTo(f); | 565 field_value()->PrintTo(f); |
| 572 } | 566 } |
| 573 | 567 |
| 574 | 568 |
| 575 void StoreStaticFieldInstr::PrintOperandsTo(BufferFormatter* f) const { | 569 void StoreStaticFieldInstr::PrintOperandsTo(BufferFormatter* f) const { |
| 576 f->Print("%s, ", String::Handle(field().name()).ToCString()); | 570 f->Print("%s, ", String::Handle(field().name()).ToCString()); |
| 577 value()->PrintTo(f); | 571 value()->PrintTo(f); |
| 578 } | 572 } |
| 579 | 573 |
| 580 | 574 |
| 581 void InstanceOfInstr::PrintOperandsTo(BufferFormatter* f) const { | 575 void InstanceOfInstr::PrintOperandsTo(BufferFormatter* f) const { |
| 582 value()->PrintTo(f); | 576 value()->PrintTo(f); |
| 583 f->Print(" %s %s", | 577 f->Print(" %s %s", negate_result() ? "ISNOT" : "IS", |
| 584 negate_result() ? "ISNOT" : "IS", | 578 String::Handle(type().Name()).ToCString()); |
| 585 String::Handle(type().Name()).ToCString()); | |
| 586 f->Print(" type-arg("); | 579 f->Print(" type-arg("); |
| 587 instantiator_type_arguments()->PrintTo(f); | 580 instantiator_type_arguments()->PrintTo(f); |
| 588 f->Print(")"); | 581 f->Print(")"); |
| 589 } | 582 } |
| 590 | 583 |
| 591 | 584 |
| 592 void RelationalOpInstr::PrintOperandsTo(BufferFormatter* f) const { | 585 void RelationalOpInstr::PrintOperandsTo(BufferFormatter* f) const { |
| 593 f->Print("%s, ", Token::Str(kind())); | 586 f->Print("%s, ", Token::Str(kind())); |
| 594 left()->PrintTo(f); | 587 left()->PrintTo(f); |
| 595 f->Print(", "); | 588 f->Print(", "); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 622 | 615 |
| 623 void LoadFieldInstr::PrintOperandsTo(BufferFormatter* f) const { | 616 void LoadFieldInstr::PrintOperandsTo(BufferFormatter* f) const { |
| 624 instance()->PrintTo(f); | 617 instance()->PrintTo(f); |
| 625 f->Print(", %" Pd, offset_in_bytes()); | 618 f->Print(", %" Pd, offset_in_bytes()); |
| 626 | 619 |
| 627 if (field() != NULL) { | 620 if (field() != NULL) { |
| 628 f->Print(" {%s}", String::Handle(field()->name()).ToCString()); | 621 f->Print(" {%s}", String::Handle(field()->name()).ToCString()); |
| 629 const char* expected = "?"; | 622 const char* expected = "?"; |
| 630 if (field()->guarded_cid() != kIllegalCid) { | 623 if (field()->guarded_cid() != kIllegalCid) { |
| 631 const Class& cls = Class::Handle( | 624 const Class& cls = Class::Handle( |
| 632 Isolate::Current()->class_table()->At(field()->guarded_cid())); | 625 Isolate::Current()->class_table()->At(field()->guarded_cid())); |
| 633 expected = String::Handle(cls.Name()).ToCString(); | 626 expected = String::Handle(cls.Name()).ToCString(); |
| 634 } | 627 } |
| 635 | 628 |
| 636 f->Print(" [%s %s]", | 629 f->Print(" [%s %s]", field()->is_nullable() ? "nullable" : "non-nullable", |
| 637 field()->is_nullable() ? "nullable" : "non-nullable", | |
| 638 expected); | 630 expected); |
| 639 } | 631 } |
| 640 | 632 |
| 641 f->Print(", immutable=%d", immutable_); | 633 f->Print(", immutable=%d", immutable_); |
| 642 } | 634 } |
| 643 | 635 |
| 644 | 636 |
| 645 void InstantiateTypeInstr::PrintOperandsTo(BufferFormatter* f) const { | 637 void InstantiateTypeInstr::PrintOperandsTo(BufferFormatter* f) const { |
| 646 const String& type_name = String::Handle(type().Name()); | 638 const String& type_name = String::Handle(type().Name()); |
| 647 f->Print("%s, ", type_name.ToCString()); | 639 f->Print("%s, ", type_name.ToCString()); |
| (...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 984 void UnaryDoubleOpInstr::PrintOperandsTo(BufferFormatter* f) const { | 976 void UnaryDoubleOpInstr::PrintOperandsTo(BufferFormatter* f) const { |
| 985 f->Print("%s, ", Token::Str(op_kind())); | 977 f->Print("%s, ", Token::Str(op_kind())); |
| 986 value()->PrintTo(f); | 978 value()->PrintTo(f); |
| 987 } | 979 } |
| 988 | 980 |
| 989 | 981 |
| 990 void CheckClassIdInstr::PrintOperandsTo(BufferFormatter* f) const { | 982 void CheckClassIdInstr::PrintOperandsTo(BufferFormatter* f) const { |
| 991 value()->PrintTo(f); | 983 value()->PrintTo(f); |
| 992 | 984 |
| 993 const Class& cls = | 985 const Class& cls = |
| 994 Class::Handle(Isolate::Current()->class_table()->At(cid())); | 986 Class::Handle(Isolate::Current()->class_table()->At(cid())); |
| 995 f->Print(", %s", String::Handle(cls.ScrubbedName()).ToCString()); | 987 f->Print(", %s", String::Handle(cls.ScrubbedName()).ToCString()); |
| 996 } | 988 } |
| 997 | 989 |
| 998 | 990 |
| 999 void CheckClassInstr::PrintOperandsTo(BufferFormatter* f) const { | 991 void CheckClassInstr::PrintOperandsTo(BufferFormatter* f) const { |
| 1000 value()->PrintTo(f); | 992 value()->PrintTo(f); |
| 1001 if (FLAG_display_sorted_ic_data) { | 993 if (FLAG_display_sorted_ic_data) { |
| 1002 PrintICDataSortedHelper(f, unary_checks()); | 994 PrintICDataSortedHelper(f, unary_checks()); |
| 1003 } else { | 995 } else { |
| 1004 PrintICDataHelper(f, unary_checks(), FlowGraphPrinter::kPrintAll); | 996 PrintICDataHelper(f, unary_checks(), FlowGraphPrinter::kPrintAll); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 1025 f->Print("\n "); | 1017 f->Print("\n "); |
| 1026 def->PrintTo(f); | 1018 def->PrintTo(f); |
| 1027 } | 1019 } |
| 1028 f->Print("\n}"); | 1020 f->Print("\n}"); |
| 1029 } | 1021 } |
| 1030 } | 1022 } |
| 1031 | 1023 |
| 1032 | 1024 |
| 1033 void JoinEntryInstr::PrintTo(BufferFormatter* f) const { | 1025 void JoinEntryInstr::PrintTo(BufferFormatter* f) const { |
| 1034 if (try_index() != CatchClauseNode::kInvalidTryIndex) { | 1026 if (try_index() != CatchClauseNode::kInvalidTryIndex) { |
| 1035 f->Print("B%" Pd "[join try_idx %" Pd "]:%" Pd " pred(", | 1027 f->Print("B%" Pd "[join try_idx %" Pd "]:%" Pd " pred(", block_id(), |
| 1036 block_id(), try_index(), GetDeoptId()); | 1028 try_index(), GetDeoptId()); |
| 1037 } else { | 1029 } else { |
| 1038 f->Print("B%" Pd "[join]:%" Pd " pred(", block_id(), GetDeoptId()); | 1030 f->Print("B%" Pd "[join]:%" Pd " pred(", block_id(), GetDeoptId()); |
| 1039 } | 1031 } |
| 1040 for (intptr_t i = 0; i < predecessors_.length(); ++i) { | 1032 for (intptr_t i = 0; i < predecessors_.length(); ++i) { |
| 1041 if (i > 0) f->Print(", "); | 1033 if (i > 0) f->Print(", "); |
| 1042 f->Print("B%" Pd, predecessors_[i]->block_id()); | 1034 f->Print("B%" Pd, predecessors_[i]->block_id()); |
| 1043 } | 1035 } |
| 1044 f->Print(")"); | 1036 f->Print(")"); |
| 1045 if (phis_ != NULL) { | 1037 if (phis_ != NULL) { |
| 1046 f->Print(" {"); | 1038 f->Print(" {"); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 1075 } | 1067 } |
| 1076 f->Print("\n}"); | 1068 f->Print("\n}"); |
| 1077 } | 1069 } |
| 1078 if (HasParallelMove()) { | 1070 if (HasParallelMove()) { |
| 1079 f->Print(" "); | 1071 f->Print(" "); |
| 1080 parallel_move()->PrintTo(f); | 1072 parallel_move()->PrintTo(f); |
| 1081 } | 1073 } |
| 1082 } | 1074 } |
| 1083 | 1075 |
| 1084 | 1076 |
| 1085 static const char *RepresentationToCString(Representation rep) { | 1077 static const char* RepresentationToCString(Representation rep) { |
| 1086 switch (rep) { | 1078 switch (rep) { |
| 1087 case kTagged: | 1079 case kTagged: |
| 1088 return "tagged"; | 1080 return "tagged"; |
| 1089 case kUntagged: | 1081 case kUntagged: |
| 1090 return "untagged"; | 1082 return "untagged"; |
| 1091 case kUnboxedDouble: | 1083 case kUnboxedDouble: |
| 1092 return "double"; | 1084 return "double"; |
| 1093 case kUnboxedInt32: | 1085 case kUnboxedInt32: |
| 1094 return "int32"; | 1086 return "int32"; |
| 1095 case kUnboxedUint32: | 1087 case kUnboxedUint32: |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1110 return "none"; | 1102 return "none"; |
| 1111 case kNumRepresentations: | 1103 case kNumRepresentations: |
| 1112 UNREACHABLE(); | 1104 UNREACHABLE(); |
| 1113 } | 1105 } |
| 1114 return "?"; | 1106 return "?"; |
| 1115 } | 1107 } |
| 1116 | 1108 |
| 1117 | 1109 |
| 1118 void PhiInstr::PrintTo(BufferFormatter* f) const { | 1110 void PhiInstr::PrintTo(BufferFormatter* f) const { |
| 1119 if (HasPairRepresentation()) { | 1111 if (HasPairRepresentation()) { |
| 1120 f->Print("(v%" Pd ", v%" Pd ") <- phi(", | 1112 f->Print("(v%" Pd ", v%" Pd ") <- phi(", ssa_temp_index(), |
| 1121 ssa_temp_index(), ssa_temp_index() + 1); | 1113 ssa_temp_index() + 1); |
| 1122 } else { | 1114 } else { |
| 1123 f->Print("v%" Pd " <- phi(", ssa_temp_index()); | 1115 f->Print("v%" Pd " <- phi(", ssa_temp_index()); |
| 1124 } | 1116 } |
| 1125 for (intptr_t i = 0; i < inputs_.length(); ++i) { | 1117 for (intptr_t i = 0; i < inputs_.length(); ++i) { |
| 1126 if (inputs_[i] != NULL) inputs_[i]->PrintTo(f); | 1118 if (inputs_[i] != NULL) inputs_[i]->PrintTo(f); |
| 1127 if (i < inputs_.length() - 1) f->Print(", "); | 1119 if (i < inputs_.length() - 1) f->Print(", "); |
| 1128 } | 1120 } |
| 1129 f->Print(")"); | 1121 f->Print(")"); |
| 1130 if (is_alive()) { | 1122 if (is_alive()) { |
| 1131 f->Print(" alive"); | 1123 f->Print(" alive"); |
| 1132 } else { | 1124 } else { |
| 1133 f->Print(" dead"); | 1125 f->Print(" dead"); |
| 1134 } | 1126 } |
| 1135 if (range_ != NULL) { | 1127 if (range_ != NULL) { |
| 1136 f->Print(" "); | 1128 f->Print(" "); |
| 1137 range_->PrintTo(f); | 1129 range_->PrintTo(f); |
| 1138 } | 1130 } |
| 1139 | 1131 |
| 1140 if (representation() != kNoRepresentation && | 1132 if (representation() != kNoRepresentation && representation() != kTagged) { |
| 1141 representation() != kTagged) { | |
| 1142 f->Print(" %s", RepresentationToCString(representation())); | 1133 f->Print(" %s", RepresentationToCString(representation())); |
| 1143 } | 1134 } |
| 1144 | 1135 |
| 1145 if (type_ != NULL) { | 1136 if (type_ != NULL) { |
| 1146 f->Print(" "); | 1137 f->Print(" "); |
| 1147 type_->PrintTo(f); | 1138 type_->PrintTo(f); |
| 1148 } | 1139 } |
| 1149 } | 1140 } |
| 1150 | 1141 |
| 1151 | 1142 |
| 1152 void UnboxIntegerInstr::PrintOperandsTo(BufferFormatter* f) const { | 1143 void UnboxIntegerInstr::PrintOperandsTo(BufferFormatter* f) const { |
| 1153 if (is_truncating()) { | 1144 if (is_truncating()) { |
| 1154 f->Print("[tr], "); | 1145 f->Print("[tr], "); |
| 1155 } | 1146 } |
| 1156 Definition::PrintOperandsTo(f); | 1147 Definition::PrintOperandsTo(f); |
| 1157 } | 1148 } |
| 1158 | 1149 |
| 1159 | 1150 |
| 1160 void UnboxedIntConverterInstr::PrintOperandsTo(BufferFormatter* f) const { | 1151 void UnboxedIntConverterInstr::PrintOperandsTo(BufferFormatter* f) const { |
| 1161 f->Print("%s->%s%s, ", | 1152 f->Print("%s->%s%s, ", RepresentationToCString(from()), |
| 1162 RepresentationToCString(from()), | 1153 RepresentationToCString(to()), is_truncating() ? "[tr]" : ""); |
| 1163 RepresentationToCString(to()), | |
| 1164 is_truncating() ? "[tr]" : ""); | |
| 1165 Definition::PrintOperandsTo(f); | 1154 Definition::PrintOperandsTo(f); |
| 1166 } | 1155 } |
| 1167 | 1156 |
| 1168 | 1157 |
| 1169 void ParameterInstr::PrintOperandsTo(BufferFormatter* f) const { | 1158 void ParameterInstr::PrintOperandsTo(BufferFormatter* f) const { |
| 1170 f->Print("%" Pd, index()); | 1159 f->Print("%" Pd, index()); |
| 1171 } | 1160 } |
| 1172 | 1161 |
| 1173 | 1162 |
| 1174 void CheckStackOverflowInstr::PrintOperandsTo(BufferFormatter* f) const { | 1163 void CheckStackOverflowInstr::PrintOperandsTo(BufferFormatter* f) const { |
| 1175 if (in_loop()) f->Print("depth %" Pd, loop_depth()); | 1164 if (in_loop()) f->Print("depth %" Pd, loop_depth()); |
| 1176 } | 1165 } |
| 1177 | 1166 |
| 1178 | 1167 |
| 1179 void TargetEntryInstr::PrintTo(BufferFormatter* f) const { | 1168 void TargetEntryInstr::PrintTo(BufferFormatter* f) const { |
| 1180 if (try_index() != CatchClauseNode::kInvalidTryIndex) { | 1169 if (try_index() != CatchClauseNode::kInvalidTryIndex) { |
| 1181 f->Print("B%" Pd "[target try_idx %" Pd "]:%" Pd, | 1170 f->Print("B%" Pd "[target try_idx %" Pd "]:%" Pd, block_id(), try_index(), |
| 1182 block_id(), try_index(), GetDeoptId()); | 1171 GetDeoptId()); |
| 1183 } else { | 1172 } else { |
| 1184 f->Print("B%" Pd "[target]:%" Pd, block_id(), GetDeoptId()); | 1173 f->Print("B%" Pd "[target]:%" Pd, block_id(), GetDeoptId()); |
| 1185 } | 1174 } |
| 1186 if (HasParallelMove()) { | 1175 if (HasParallelMove()) { |
| 1187 f->Print(" "); | 1176 f->Print(" "); |
| 1188 parallel_move()->PrintTo(f); | 1177 parallel_move()->PrintTo(f); |
| 1189 } | 1178 } |
| 1190 } | 1179 } |
| 1191 | 1180 |
| 1192 | 1181 |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1238 InputAt(0)->PrintTo(f); | 1227 InputAt(0)->PrintTo(f); |
| 1239 f->Print(")"); | 1228 f->Print(")"); |
| 1240 } | 1229 } |
| 1241 | 1230 |
| 1242 | 1231 |
| 1243 void BranchInstr::PrintTo(BufferFormatter* f) const { | 1232 void BranchInstr::PrintTo(BufferFormatter* f) const { |
| 1244 f->Print("%s ", DebugName()); | 1233 f->Print("%s ", DebugName()); |
| 1245 f->Print("if "); | 1234 f->Print("if "); |
| 1246 comparison()->PrintTo(f); | 1235 comparison()->PrintTo(f); |
| 1247 | 1236 |
| 1248 f->Print(" goto (%" Pd ", %" Pd ")", | 1237 f->Print(" goto (%" Pd ", %" Pd ")", true_successor()->block_id(), |
| 1249 true_successor()->block_id(), | 1238 false_successor()->block_id()); |
| 1250 false_successor()->block_id()); | |
| 1251 } | 1239 } |
| 1252 | 1240 |
| 1253 | 1241 |
| 1254 void ParallelMoveInstr::PrintTo(BufferFormatter* f) const { | 1242 void ParallelMoveInstr::PrintTo(BufferFormatter* f) const { |
| 1255 f->Print("%s ", DebugName()); | 1243 f->Print("%s ", DebugName()); |
| 1256 for (intptr_t i = 0; i < moves_.length(); i++) { | 1244 for (intptr_t i = 0; i < moves_.length(); i++) { |
| 1257 if (i != 0) f->Print(", "); | 1245 if (i != 0) f->Print(", "); |
| 1258 moves_[i]->dest().PrintTo(f); | 1246 moves_[i]->dest().PrintTo(f); |
| 1259 f->Print(" <- "); | 1247 f->Print(" <- "); |
| 1260 moves_[i]->src().PrintTo(f); | 1248 moves_[i]->src().PrintTo(f); |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1331 } | 1319 } |
| 1332 | 1320 |
| 1333 | 1321 |
| 1334 bool FlowGraphPrinter::ShouldPrint(const Function& function) { | 1322 bool FlowGraphPrinter::ShouldPrint(const Function& function) { |
| 1335 return false; | 1323 return false; |
| 1336 } | 1324 } |
| 1337 | 1325 |
| 1338 #endif // !PRODUCT | 1326 #endif // !PRODUCT |
| 1339 | 1327 |
| 1340 } // namespace dart | 1328 } // namespace dart |
| OLD | NEW |