blob: 64766765bf0b9a91e69d0850b5887e104bf7126f [file] [log] [blame]
// Copyright 2013 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "src/compiler/node.h"
#include "src/compiler/node-properties.h"
#include "src/compiler/node-properties-inl.h"
#include "src/compiler/schedule.h"
#include "src/ostreams.h"
namespace v8 {
namespace internal {
namespace compiler {
OStream& operator<<(OStream& os, const BasicBlockData::Control& c) {
switch (c) {
case BasicBlockData::kNone:
return os << "none";
case BasicBlockData::kGoto:
return os << "goto";
case BasicBlockData::kBranch:
return os << "branch";
case BasicBlockData::kReturn:
return os << "return";
case BasicBlockData::kThrow:
return os << "throw";
case BasicBlockData::kCall:
return os << "call";
case BasicBlockData::kDeoptimize:
return os << "deoptimize";
}
UNREACHABLE();
return os;
}
OStream& operator<<(OStream& os, const Schedule& s) {
// TODO(svenpanne) Const-correct the RPO stuff/iterators.
BasicBlockVector* rpo = const_cast<Schedule*>(&s)->rpo_order();
for (BasicBlockVectorIter i = rpo->begin(); i != rpo->end(); ++i) {
BasicBlock* block = *i;
os << "--- BLOCK B" << block->id();
if (block->PredecessorCount() != 0) os << " <- ";
BasicBlock::Predecessors predecessors = block->predecessors();
bool comma = false;
for (BasicBlock::Predecessors::iterator j = predecessors.begin();
j != predecessors.end(); ++j) {
if (comma) os << ", ";
comma = true;
os << "B" << (*j)->id();
}
os << " ---\n";
for (BasicBlock::const_iterator j = block->begin(); j != block->end();
++j) {
Node* node = *j;
os << " " << *node;
if (!NodeProperties::IsControl(node)) {
Bounds bounds = NodeProperties::GetBounds(node);
os << " : ";
bounds.lower->PrintTo(os);
if (!bounds.upper->Is(bounds.lower)) {
os << "..";
bounds.upper->PrintTo(os);
}
}
os << "\n";
}
BasicBlock::Control control = block->control_;
if (control != BasicBlock::kNone) {
os << " ";
if (block->control_input_ != NULL) {
os << *block->control_input_;
} else {
os << "Goto";
}
os << " -> ";
BasicBlock::Successors successors = block->successors();
comma = false;
for (BasicBlock::Successors::iterator j = successors.begin();
j != successors.end(); ++j) {
if (comma) os << ", ";
comma = true;
os << "B" << (*j)->id();
}
os << "\n";
}
}
return os;
}
} // namespace compiler
} // namespace internal
} // namespace v8