Index: src/flow-graph.h |
=================================================================== |
--- src/flow-graph.h (revision 5322) |
+++ src/flow-graph.h (working copy) |
@@ -1,180 +0,0 @@ |
-// Copyright 2010 the V8 project authors. All rights reserved. |
-// Redistribution and use in source and binary forms, with or without |
-// modification, are permitted provided that the following conditions are |
-// met: |
-// |
-// * Redistributions of source code must retain the above copyright |
-// notice, this list of conditions and the following disclaimer. |
-// * Redistributions in binary form must reproduce the above |
-// copyright notice, this list of conditions and the following |
-// disclaimer in the documentation and/or other materials provided |
-// with the distribution. |
-// * Neither the name of Google Inc. nor the names of its |
-// contributors may be used to endorse or promote products derived |
-// from this software without specific prior written permission. |
-// |
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
- |
-#ifndef V8_FLOW_GRAPH_H_ |
-#define V8_FLOW_GRAPH_H_ |
- |
-#include "v8.h" |
- |
-#include "data-flow.h" |
-#include "zone.h" |
- |
-namespace v8 { |
-namespace internal { |
- |
-// The nodes of a flow graph are basic blocks. Basic blocks consist of |
-// instructions represented as pointers to AST nodes in the order that they |
-// would be visited by the code generator. A block can have arbitrarily many |
-// (even zero) predecessors and up to two successors. Blocks with multiple |
-// predecessors are "join nodes" and blocks with multiple successors are |
-// "branch nodes". A block can be both a branch and a join node. |
-// |
-// Flow graphs are in edge split form: a branch node is never the |
-// predecessor of a merge node. Empty basic blocks are inserted to maintain |
-// edge split form. |
-class BasicBlock: public ZoneObject { |
- public: |
- // Construct a basic block with a given predecessor. NULL indicates no |
- // predecessor or that the predecessor will be set later. |
- explicit BasicBlock(BasicBlock* predecessor) |
- : predecessors_(2), |
- instructions_(8), |
- left_successor_(NULL), |
- right_successor_(NULL), |
- mark_(false) { |
- if (predecessor != NULL) AddPredecessor(predecessor); |
- } |
- |
- bool HasPredecessor() { return !predecessors_.is_empty(); } |
- bool HasSuccessor() { return left_successor_ != NULL; } |
- |
- // Add a given basic block as a predecessor of this block. This function |
- // also adds this block as a successor of the given block. |
- void AddPredecessor(BasicBlock* predecessor) { |
- ASSERT(predecessor != NULL); |
- predecessors_.Add(predecessor); |
- predecessor->AddSuccessor(this); |
- } |
- |
- // Add an instruction to the end of this block. The block must be "open" |
- // by not having a successor yet. |
- void AddInstruction(AstNode* instruction) { |
- ASSERT(!HasSuccessor() && instruction != NULL); |
- instructions_.Add(instruction); |
- } |
- |
- // Perform a depth-first traversal of graph rooted at this node, |
- // accumulating pre- and postorder traversal orders. Visited nodes are |
- // marked with mark. |
- void BuildTraversalOrder(ZoneList<BasicBlock*>* preorder, |
- ZoneList<BasicBlock*>* postorder, |
- bool mark); |
- bool GetMark() { return mark_; } |
- |
-#ifdef DEBUG |
- // In debug mode, blocks are numbered in reverse postorder to help with |
- // printing. |
- int number() { return number_; } |
- void set_number(int n) { number_ = n; } |
- |
- // Print a basic block, given the number of the first instruction. |
- // Returns the next number after the number of the last instruction. |
- int PrintAsText(int instruction_number); |
-#endif |
- |
- private: |
- // Add a given basic block as successor to this block. This function does |
- // not add this block as a predecessor of the given block so as to avoid |
- // circularity. |
- void AddSuccessor(BasicBlock* successor) { |
- ASSERT(right_successor_ == NULL && successor != NULL); |
- if (HasSuccessor()) { |
- right_successor_ = successor; |
- } else { |
- left_successor_ = successor; |
- } |
- } |
- |
- ZoneList<BasicBlock*> predecessors_; |
- ZoneList<AstNode*> instructions_; |
- BasicBlock* left_successor_; |
- BasicBlock* right_successor_; |
- |
- // Support for graph traversal. Before traversal, all nodes in the graph |
- // have the same mark (true or false). Traversal marks already-visited |
- // nodes with the opposite mark. After traversal, all nodes again have |
- // the same mark. Traversal of the same graph is not reentrant. |
- bool mark_; |
- |
-#ifdef DEBUG |
- int number_; |
-#endif |
- |
- DISALLOW_COPY_AND_ASSIGN(BasicBlock); |
-}; |
- |
- |
-// A flow graph has distinguished entry and exit blocks. The entry block is |
-// the only one with no predecessors and the exit block is the only one with |
-// no successors. |
-class FlowGraph: public ZoneObject { |
- public: |
- FlowGraph(BasicBlock* entry, BasicBlock* exit) |
- : entry_(entry), exit_(exit), preorder_(8), postorder_(8) { |
- } |
- |
- ZoneList<BasicBlock*>* preorder() { return &preorder_; } |
- ZoneList<BasicBlock*>* postorder() { return &postorder_; } |
- |
-#ifdef DEBUG |
- void PrintAsText(Handle<String> name); |
-#endif |
- |
- private: |
- BasicBlock* entry_; |
- BasicBlock* exit_; |
- ZoneList<BasicBlock*> preorder_; |
- ZoneList<BasicBlock*> postorder_; |
-}; |
- |
- |
-// The flow graph builder walks the AST adding reachable AST nodes to the |
-// flow graph as instructions. It remembers the entry and exit nodes of the |
-// graph, and keeps a pointer to the current block being constructed. |
-class FlowGraphBuilder: public AstVisitor { |
- public: |
- FlowGraphBuilder() {} |
- |
- FlowGraph* Build(FunctionLiteral* lit); |
- |
- private: |
- // AST node visit functions. |
-#define DECLARE_VISIT(type) virtual void Visit##type(type* node); |
- AST_NODE_LIST(DECLARE_VISIT) |
-#undef DECLARE_VISIT |
- |
- BasicBlock* entry_; |
- BasicBlock* exit_; |
- BasicBlock* current_; |
- |
- DISALLOW_COPY_AND_ASSIGN(FlowGraphBuilder); |
-}; |
- |
- |
-} } // namespace v8::internal |
- |
-#endif // V8_FLOW_GRAPH_H_ |