Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(66)

Unified Diff: src/cfg.h

Issue 159701: Restructure to support recursive invocation of the CFG builder. Add... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: Created 11 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/arm/cfg-arm.cc ('k') | src/cfg.cc » ('j') | src/cfg.cc » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/cfg.h
===================================================================
--- src/cfg.h (revision 2602)
+++ src/cfg.h (working copy)
@@ -33,6 +33,47 @@
namespace v8 {
namespace internal {
+class ExitNode;
+
+// A convenient class to keep 'global' values when building a CFG. Since
+// CFG construction can be invoked recursively, CFG globals are stacked.
+class CfgGlobals BASE_EMBEDDED {
+ public:
+ explicit CfgGlobals(FunctionLiteral* fun);
+
+ ~CfgGlobals() { top_ = previous_; }
+
+ static CfgGlobals* current() {
+ ASSERT(top_ != NULL);
+ return top_;
+ }
+
+ FunctionLiteral* fun() { return global_fun_; }
+
+ ExitNode* exit() { return global_exit_; }
+
+#ifdef DEBUG
+ int next_number() { return node_counter_++; }
+#endif
+
+ private:
+ static CfgGlobals* top_;
+
+ // Function literal currently compiling.
+ FunctionLiteral* global_fun_;
+
+ // Shared global exit node for all returns from the same function.
+ ExitNode* global_exit_;
+
+#ifdef DEBUG
+ // Used to number nodes when printing.
+ int node_counter_;
+#endif
+
+ CfgGlobals* previous_;
+};
+
+
// Values appear in instructions. They represent trivial source
// expressions: ones with no side effects and that do not require code to be
// generated.
@@ -66,6 +107,37 @@
};
+// Locations are values that can be stored into ('lvalues').
+class Location : public Value {
+ public:
+ virtual ~Location() {}
+
+ virtual void ToRegister(MacroAssembler* masm, Register reg) = 0;
+
+#ifdef DEBUG
+ virtual void Print() = 0;
+#endif
+};
+
+
+// SlotLocations represent parameters and stack-allocated (i.e.,
+// non-context) local variables.
+class SlotLocation : public Location {
+ public:
+ SlotLocation(Slot::Type type, int index) : type_(type), index_(index) {}
+
+ void ToRegister(MacroAssembler* masm, Register reg);
+
+#ifdef DEBUG
+ void Print();
+#endif
+
+ private:
+ Slot::Type type_;
+ int index_;
+};
+
+
// Instructions are computations. The represent non-trivial source
// expressions: typically ones that have side effects and require code to
// be generated.
@@ -114,8 +186,6 @@
bool is_marked() { return is_marked_; }
- static void Reset();
-
virtual bool is_block() { return false; }
virtual void Unmark() = 0;
@@ -124,7 +194,7 @@
#ifdef DEBUG
int number() {
- if (number_ == -1) number_ = node_counter_++;
+ if (number_ == -1) number_ = CfgGlobals::current()->next_number();
return number_;
}
@@ -136,8 +206,6 @@
#ifdef DEBUG
int number_;
-
- static int node_counter_;
#endif
};
@@ -182,7 +250,7 @@
// containing the function's first instruction.
class EntryNode : public CfgNode {
public:
- EntryNode(FunctionLiteral* fun, InstructionBlock* succ);
+ explicit EntryNode(InstructionBlock* succ) : successor_(succ) {}
virtual ~EntryNode() {}
@@ -196,7 +264,6 @@
private:
InstructionBlock* successor_;
- int local_count_;
};
@@ -205,7 +272,7 @@
// the blocks returning from the function.
class ExitNode : public CfgNode {
public:
- explicit ExitNode(FunctionLiteral* fun);
+ ExitNode() {}
virtual ~ExitNode() {}
@@ -216,16 +283,13 @@
#ifdef DEBUG
void Print();
#endif
-
- private:
- int parameter_count_;
};
-// A CFG is a consists of a linked structure of nodes. It has a single
-// entry node and optionally an exit node. There is a distinguished global
-// exit node that is used as the successor of all blocks that return from
-// the function.
+// A CFG consists of a linked structure of nodes. It has a single entry
+// node and optionally an exit node. There is a distinguished global exit
+// node that is used as the successor of all blocks that return from the
+// function.
//
// Fragments of control-flow graphs, produced when traversing the statements
// and expressions in the source AST, are represented by the same class.
@@ -241,7 +305,7 @@
explicit Cfg(InstructionBlock* block) : entry_(block), exit_(block) {}
// Build the CFG for a function.
- static Cfg* Build(FunctionLiteral* fun);
+ static Cfg* Build();
// The entry and exit nodes.
CfgNode* entry() { return entry_; }
@@ -256,7 +320,7 @@
// Add an entry node to a CFG fragment. It is no longer a fragment
// (instructions cannot be prepended).
- void PrependEntryNode(FunctionLiteral* fun);
+ void PrependEntryNode();
// Append an instruction to the end of a CFG fragment. Assumes it has an
// available exit.
@@ -266,7 +330,7 @@
// longer has an available exit node.
void AppendReturnInstruction(Value* value);
- Handle<Code> Compile(FunctionLiteral* fun, Handle<Script> script);
+ Handle<Code> Compile(Handle<Script> script);
#ifdef DEBUG
// Support for printing.
@@ -274,12 +338,6 @@
#endif
private:
- // Reset static variables before building the CFG for a function.
- static void Reset(FunctionLiteral* fun);
-
- // Shared global exit nodes for all returns from the same function.
- static ExitNode* global_exit_;
-
// Entry and exit nodes.
CfgNode* entry_;
CfgNode* exit_;
« no previous file with comments | « src/arm/cfg-arm.cc ('k') | src/cfg.cc » ('j') | src/cfg.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698