• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
3 // found in the LICENSE file.
4 
5 #include "src/compiler/node.h"
6 #include "src/compiler/node-properties.h"
7 #include "src/compiler/node-properties-inl.h"
8 #include "src/compiler/schedule.h"
9 #include "src/ostreams.h"
10 
11 namespace v8 {
12 namespace internal {
13 namespace compiler {
14 
operator <<(OStream & os,const BasicBlockData::Control & c)15 OStream& operator<<(OStream& os, const BasicBlockData::Control& c) {
16   switch (c) {
17     case BasicBlockData::kNone:
18       return os << "none";
19     case BasicBlockData::kGoto:
20       return os << "goto";
21     case BasicBlockData::kBranch:
22       return os << "branch";
23     case BasicBlockData::kReturn:
24       return os << "return";
25     case BasicBlockData::kThrow:
26       return os << "throw";
27   }
28   UNREACHABLE();
29   return os;
30 }
31 
32 
operator <<(OStream & os,const Schedule & s)33 OStream& operator<<(OStream& os, const Schedule& s) {
34   // TODO(svenpanne) Const-correct the RPO stuff/iterators.
35   BasicBlockVector* rpo = const_cast<Schedule*>(&s)->rpo_order();
36   for (BasicBlockVectorIter i = rpo->begin(); i != rpo->end(); ++i) {
37     BasicBlock* block = *i;
38     os << "--- BLOCK B" << block->id();
39     if (block->PredecessorCount() != 0) os << " <- ";
40     BasicBlock::Predecessors predecessors = block->predecessors();
41     bool comma = false;
42     for (BasicBlock::Predecessors::iterator j = predecessors.begin();
43          j != predecessors.end(); ++j) {
44       if (comma) os << ", ";
45       comma = true;
46       os << "B" << (*j)->id();
47     }
48     os << " ---\n";
49     for (BasicBlock::const_iterator j = block->begin(); j != block->end();
50          ++j) {
51       Node* node = *j;
52       os << "  " << *node;
53       if (!NodeProperties::IsControl(node)) {
54         Bounds bounds = NodeProperties::GetBounds(node);
55         os << " : ";
56         bounds.lower->PrintTo(os);
57         if (!bounds.upper->Is(bounds.lower)) {
58           os << "..";
59           bounds.upper->PrintTo(os);
60         }
61       }
62       os << "\n";
63     }
64     BasicBlock::Control control = block->control_;
65     if (control != BasicBlock::kNone) {
66       os << "  ";
67       if (block->control_input_ != NULL) {
68         os << *block->control_input_;
69       } else {
70         os << "Goto";
71       }
72       os << " -> ";
73       BasicBlock::Successors successors = block->successors();
74       comma = false;
75       for (BasicBlock::Successors::iterator j = successors.begin();
76            j != successors.end(); ++j) {
77         if (comma) os << ", ";
78         comma = true;
79         os << "B" << (*j)->id();
80       }
81       os << "\n";
82     }
83   }
84   return os;
85 }
86 }  // namespace compiler
87 }  // namespace internal
88 }  // namespace v8
89