| OLD | NEW | 
|    1 // Copyright 2013 the V8 project authors. All rights reserved. |    1 // Copyright 2013 the V8 project authors. All rights reserved. | 
|    2 // Use of this source code is governed by a BSD-style license that can be |    2 // Use of this source code is governed by a BSD-style license that can be | 
|    3 // found in the LICENSE file. |    3 // found in the LICENSE file. | 
|    4  |    4  | 
|    5 #include "src/compiler/graph-visualizer.h" |    5 #include "src/compiler/graph-visualizer.h" | 
|    6  |    6  | 
|    7 #include <sstream> |    7 #include <sstream> | 
|    8 #include <string> |    8 #include <string> | 
|    9  |    9  | 
|   10 #include "src/code-stubs.h" |   10 #include "src/code-stubs.h" | 
| (...skipping 23 matching lines...) Expand all  Loading... | 
|   34     SNPrintF(filename, "turbo-%s", debug_name.get()); |   34     SNPrintF(filename, "turbo-%s", debug_name.get()); | 
|   35   } else if (info->has_shared_info()) { |   35   } else if (info->has_shared_info()) { | 
|   36     SNPrintF(filename, "turbo-%p", static_cast<void*>(info)); |   36     SNPrintF(filename, "turbo-%p", static_cast<void*>(info)); | 
|   37   } else { |   37   } else { | 
|   38     SNPrintF(filename, "turbo-none-%s", phase); |   38     SNPrintF(filename, "turbo-none-%s", phase); | 
|   39   } |   39   } | 
|   40   std::replace(filename.start(), filename.start() + filename.length(), ' ', |   40   std::replace(filename.start(), filename.start() + filename.length(), ' ', | 
|   41                '_'); |   41                '_'); | 
|   42  |   42  | 
|   43   EmbeddedVector<char, 256> full_filename; |   43   EmbeddedVector<char, 256> full_filename; | 
|   44   if (phase == NULL) { |   44   if (phase == nullptr) { | 
|   45     SNPrintF(full_filename, "%s.%s", filename.start(), suffix); |   45     SNPrintF(full_filename, "%s.%s", filename.start(), suffix); | 
|   46   } else { |   46   } else { | 
|   47     SNPrintF(full_filename, "%s-%s.%s", filename.start(), phase, suffix); |   47     SNPrintF(full_filename, "%s-%s.%s", filename.start(), phase, suffix); | 
|   48   } |   48   } | 
|   49   return base::OS::FOpen(full_filename.start(), mode); |   49   return base::OS::FOpen(full_filename.start(), mode); | 
|   50 } |   50 } | 
|   51  |   51  | 
|   52  |   52  | 
|   53 static int SafeId(Node* node) { return node == NULL ? -1 : node->id(); } |   53 static int SafeId(Node* node) { return node == nullptr ? -1 : node->id(); } | 
|   54 static const char* SafeMnemonic(Node* node) { |   54 static const char* SafeMnemonic(Node* node) { | 
|   55   return node == NULL ? "null" : node->op()->mnemonic(); |   55   return node == nullptr ? "null" : node->op()->mnemonic(); | 
|   56 } |   56 } | 
|   57  |   57  | 
|   58 #define DEAD_COLOR "#999999" |   58 #define DEAD_COLOR "#999999" | 
|   59  |   59  | 
|   60 class Escaped { |   60 class Escaped { | 
|   61  public: |   61  public: | 
|   62   explicit Escaped(const std::ostringstream& os, |   62   explicit Escaped(const std::ostringstream& os, | 
|   63                    const char* escaped_chars = "<>|{}") |   63                    const char* escaped_chars = "<>|{}") | 
|   64       : str_(os.str()), escaped_chars_(escaped_chars) {} |   64       : str_(os.str()), escaped_chars_(escaped_chars) {} | 
|   65  |   65  | 
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  151       : os_(os), all_(zone, graph), first_edge_(true) {} |  151       : os_(os), all_(zone, graph), first_edge_(true) {} | 
|  152  |  152  | 
|  153   void Print() { |  153   void Print() { | 
|  154     for (Node* const node : all_.live) PrintEdges(node); |  154     for (Node* const node : all_.live) PrintEdges(node); | 
|  155     os_ << "\n"; |  155     os_ << "\n"; | 
|  156   } |  156   } | 
|  157  |  157  | 
|  158   void PrintEdges(Node* node) { |  158   void PrintEdges(Node* node) { | 
|  159     for (int i = 0; i < node->InputCount(); i++) { |  159     for (int i = 0; i < node->InputCount(); i++) { | 
|  160       Node* input = node->InputAt(i); |  160       Node* input = node->InputAt(i); | 
|  161       if (input == NULL) continue; |  161       if (input == nullptr) continue; | 
|  162       PrintEdge(node, i, input); |  162       PrintEdge(node, i, input); | 
|  163     } |  163     } | 
|  164   } |  164   } | 
|  165  |  165  | 
|  166   void PrintEdge(Node* from, int index, Node* to) { |  166   void PrintEdge(Node* from, int index, Node* to) { | 
|  167     if (first_edge_) { |  167     if (first_edge_) { | 
|  168       first_edge_ = false; |  168       first_edge_ = false; | 
|  169     } else { |  169     } else { | 
|  170       os_ << ",\n"; |  170       os_ << ",\n"; | 
|  171     } |  171     } | 
|  172     const char* edge_type = NULL; |  172     const char* edge_type = nullptr; | 
|  173     if (index < NodeProperties::FirstValueIndex(from)) { |  173     if (index < NodeProperties::FirstValueIndex(from)) { | 
|  174       edge_type = "unknown"; |  174       edge_type = "unknown"; | 
|  175     } else if (index < NodeProperties::FirstContextIndex(from)) { |  175     } else if (index < NodeProperties::FirstContextIndex(from)) { | 
|  176       edge_type = "value"; |  176       edge_type = "value"; | 
|  177     } else if (index < NodeProperties::FirstFrameStateIndex(from)) { |  177     } else if (index < NodeProperties::FirstFrameStateIndex(from)) { | 
|  178       edge_type = "context"; |  178       edge_type = "context"; | 
|  179     } else if (index < NodeProperties::FirstEffectIndex(from)) { |  179     } else if (index < NodeProperties::FirstEffectIndex(from)) { | 
|  180       edge_type = "frame-state"; |  180       edge_type = "frame-state"; | 
|  181     } else if (index < NodeProperties::FirstControlIndex(from)) { |  181     } else if (index < NodeProperties::FirstControlIndex(from)) { | 
|  182       edge_type = "effect"; |  182       edge_type = "effect"; | 
| (...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  390       os_ << " \"B" << successor->rpo_number() << "\""; |  390       os_ << " \"B" << successor->rpo_number() << "\""; | 
|  391     } |  391     } | 
|  392     os_ << "\n"; |  392     os_ << "\n"; | 
|  393  |  393  | 
|  394     PrintIndent(); |  394     PrintIndent(); | 
|  395     os_ << "xhandlers\n"; |  395     os_ << "xhandlers\n"; | 
|  396  |  396  | 
|  397     PrintIndent(); |  397     PrintIndent(); | 
|  398     os_ << "flags\n"; |  398     os_ << "flags\n"; | 
|  399  |  399  | 
|  400     if (current->dominator() != NULL) { |  400     if (current->dominator() != nullptr) { | 
|  401       PrintBlockProperty("dominator", current->dominator()->rpo_number()); |  401       PrintBlockProperty("dominator", current->dominator()->rpo_number()); | 
|  402     } |  402     } | 
|  403  |  403  | 
|  404     PrintIntProperty("loop_depth", current->loop_depth()); |  404     PrintIntProperty("loop_depth", current->loop_depth()); | 
|  405  |  405  | 
|  406     const InstructionBlock* instruction_block = |  406     const InstructionBlock* instruction_block = | 
|  407         instructions->InstructionBlockAt( |  407         instructions->InstructionBlockAt( | 
|  408             RpoNumber::FromInt(current->rpo_number())); |  408             RpoNumber::FromInt(current->rpo_number())); | 
|  409     if (instruction_block->code_start() >= 0) { |  409     if (instruction_block->code_start() >= 0) { | 
|  410       int first_index = instruction_block->first_instruction_index(); |  410       int first_index = instruction_block->first_instruction_index(); | 
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  448         Node* node = *i; |  448         Node* node = *i; | 
|  449         if (node->opcode() == IrOpcode::kPhi) continue; |  449         if (node->opcode() == IrOpcode::kPhi) continue; | 
|  450         int uses = node->UseCount(); |  450         int uses = node->UseCount(); | 
|  451         PrintIndent(); |  451         PrintIndent(); | 
|  452         os_ << "0 " << uses << " "; |  452         os_ << "0 " << uses << " "; | 
|  453         PrintNode(node); |  453         PrintNode(node); | 
|  454         if (FLAG_trace_turbo_types) { |  454         if (FLAG_trace_turbo_types) { | 
|  455           os_ << " "; |  455           os_ << " "; | 
|  456           PrintType(node); |  456           PrintType(node); | 
|  457         } |  457         } | 
|  458         if (positions != NULL) { |  458         if (positions != nullptr) { | 
|  459           SourcePosition position = positions->GetSourcePosition(node); |  459           SourcePosition position = positions->GetSourcePosition(node); | 
|  460           if (position.IsKnown()) { |  460           if (position.IsKnown()) { | 
|  461             os_ << " pos:" << position.raw(); |  461             os_ << " pos:" << position.raw(); | 
|  462           } |  462           } | 
|  463         } |  463         } | 
|  464         os_ << " <|@\n"; |  464         os_ << " <|@\n"; | 
|  465       } |  465       } | 
|  466  |  466  | 
|  467       BasicBlock::Control control = current->control(); |  467       BasicBlock::Control control = current->control(); | 
|  468       if (control != BasicBlock::kNone) { |  468       if (control != BasicBlock::kNone) { | 
|  469         PrintIndent(); |  469         PrintIndent(); | 
|  470         os_ << "0 0 "; |  470         os_ << "0 0 "; | 
|  471         if (current->control_input() != NULL) { |  471         if (current->control_input() != nullptr) { | 
|  472           PrintNode(current->control_input()); |  472           PrintNode(current->control_input()); | 
|  473         } else { |  473         } else { | 
|  474           os_ << -1 - current->rpo_number() << " Goto"; |  474           os_ << -1 - current->rpo_number() << " Goto"; | 
|  475         } |  475         } | 
|  476         os_ << " ->"; |  476         os_ << " ->"; | 
|  477         for (BasicBlock* successor : current->successors()) { |  477         for (BasicBlock* successor : current->successors()) { | 
|  478           os_ << " B" << successor->rpo_number(); |  478           os_ << " B" << successor->rpo_number(); | 
|  479         } |  479         } | 
|  480         if (FLAG_trace_turbo_types && current->control_input() != NULL) { |  480         if (FLAG_trace_turbo_types && current->control_input() != nullptr) { | 
|  481           os_ << " "; |  481           os_ << " "; | 
|  482           PrintType(current->control_input()); |  482           PrintType(current->control_input()); | 
|  483         } |  483         } | 
|  484         os_ << " <|@\n"; |  484         os_ << " <|@\n"; | 
|  485       } |  485       } | 
|  486     } |  486     } | 
|  487  |  487  | 
|  488     if (instructions != NULL) { |  488     if (instructions != nullptr) { | 
|  489       Tag LIR_tag(this, "LIR"); |  489       Tag LIR_tag(this, "LIR"); | 
|  490       for (int j = instruction_block->first_instruction_index(); |  490       for (int j = instruction_block->first_instruction_index(); | 
|  491            j <= instruction_block->last_instruction_index(); j++) { |  491            j <= instruction_block->last_instruction_index(); j++) { | 
|  492         PrintIndent(); |  492         PrintIndent(); | 
|  493         PrintableInstruction printable = { |  493         PrintableInstruction printable = { | 
|  494             RegisterConfiguration::ArchDefault(RegisterConfiguration::TURBOFAN), |  494             RegisterConfiguration::ArchDefault(RegisterConfiguration::TURBOFAN), | 
|  495             instructions->InstructionAt(j)}; |  495             instructions->InstructionAt(j)}; | 
|  496         os_ << j << " " << printable << " <|@\n"; |  496         os_ << j << " " << printable << " <|@\n"; | 
|  497       } |  497       } | 
|  498     } |  498     } | 
| (...skipping 25 matching lines...) Expand all  Loading... | 
|  524   if (range == nullptr || range->IsEmpty()) return; |  524   if (range == nullptr || range->IsEmpty()) return; | 
|  525   int vreg = range->vreg(); |  525   int vreg = range->vreg(); | 
|  526   for (LiveRange* child = range; child != nullptr; child = child->next()) { |  526   for (LiveRange* child = range; child != nullptr; child = child->next()) { | 
|  527     PrintLiveRange(child, type, vreg); |  527     PrintLiveRange(child, type, vreg); | 
|  528   } |  528   } | 
|  529 } |  529 } | 
|  530  |  530  | 
|  531  |  531  | 
|  532 void GraphC1Visualizer::PrintLiveRange(LiveRange* range, const char* type, |  532 void GraphC1Visualizer::PrintLiveRange(LiveRange* range, const char* type, | 
|  533                                        int vreg) { |  533                                        int vreg) { | 
|  534   if (range != NULL && !range->IsEmpty()) { |  534   if (range != nullptr && !range->IsEmpty()) { | 
|  535     PrintIndent(); |  535     PrintIndent(); | 
|  536     os_ << vreg << ":" << range->relative_id() << " " << type; |  536     os_ << vreg << ":" << range->relative_id() << " " << type; | 
|  537     if (range->HasRegisterAssigned()) { |  537     if (range->HasRegisterAssigned()) { | 
|  538       AllocatedOperand op = AllocatedOperand::cast(range->GetAssignedOperand()); |  538       AllocatedOperand op = AllocatedOperand::cast(range->GetAssignedOperand()); | 
|  539       if (op.IsDoubleRegister()) { |  539       if (op.IsDoubleRegister()) { | 
|  540         DoubleRegister assigned_reg = op.GetDoubleRegister(); |  540         DoubleRegister assigned_reg = op.GetDoubleRegister(); | 
|  541         os_ << " \"" << assigned_reg.ToString() << "\""; |  541         os_ << " \"" << assigned_reg.ToString() << "\""; | 
|  542       } else { |  542       } else { | 
|  543         DCHECK(op.IsRegister()); |  543         DCHECK(op.IsRegister()); | 
|  544         Register assigned_reg = op.GetRegister(); |  544         Register assigned_reg = op.GetRegister(); | 
| (...skipping 19 matching lines...) Expand all  Loading... | 
|  564     } |  564     } | 
|  565  |  565  | 
|  566     os_ << " " << vreg; |  566     os_ << " " << vreg; | 
|  567     for (auto interval = range->first_interval(); interval != nullptr; |  567     for (auto interval = range->first_interval(); interval != nullptr; | 
|  568          interval = interval->next()) { |  568          interval = interval->next()) { | 
|  569       os_ << " [" << interval->start().value() << ", " |  569       os_ << " [" << interval->start().value() << ", " | 
|  570           << interval->end().value() << "["; |  570           << interval->end().value() << "["; | 
|  571     } |  571     } | 
|  572  |  572  | 
|  573     UsePosition* current_pos = range->first_pos(); |  573     UsePosition* current_pos = range->first_pos(); | 
|  574     while (current_pos != NULL) { |  574     while (current_pos != nullptr) { | 
|  575       if (current_pos->RegisterIsBeneficial() || FLAG_trace_all_uses) { |  575       if (current_pos->RegisterIsBeneficial() || FLAG_trace_all_uses) { | 
|  576         os_ << " " << current_pos->pos().value() << " M"; |  576         os_ << " " << current_pos->pos().value() << " M"; | 
|  577       } |  577       } | 
|  578       current_pos = current_pos->next(); |  578       current_pos = current_pos->next(); | 
|  579     } |  579     } | 
|  580  |  580  | 
|  581     os_ << " \"\"\n"; |  581     os_ << " \"\"\n"; | 
|  582   } |  582   } | 
|  583 } |  583 } | 
|  584  |  584  | 
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  637         os << "#" << SafeId(i) << ":" << SafeMnemonic(i); |  637         os << "#" << SafeId(i) << ":" << SafeMnemonic(i); | 
|  638       } |  638       } | 
|  639       os << ")" << std::endl; |  639       os << ")" << std::endl; | 
|  640     } |  640     } | 
|  641   } |  641   } | 
|  642   return os; |  642   return os; | 
|  643 } |  643 } | 
|  644 }  // namespace compiler |  644 }  // namespace compiler | 
|  645 }  // namespace internal |  645 }  // namespace internal | 
|  646 }  // namespace v8 |  646 }  // namespace v8 | 
| OLD | NEW |