| Index: src/compiler/schedule.cc
|
| diff --git a/src/compiler/schedule.cc b/src/compiler/schedule.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..64766765bf0b9a91e69d0850b5887e104bf7126f
|
| --- /dev/null
|
| +++ b/src/compiler/schedule.cc
|
| @@ -0,0 +1,92 @@
|
| +// 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
|
|
|