| Index: src/compiler/bytecode-graph-builder.h | 
| diff --git a/src/compiler/bytecode-graph-builder.h b/src/compiler/bytecode-graph-builder.h | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..4e479ba3e64f79b2b3c276ca5284dc3025549de3 | 
| --- /dev/null | 
| +++ b/src/compiler/bytecode-graph-builder.h | 
| @@ -0,0 +1,174 @@ | 
| +// Copyright 2015 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. | 
| + | 
| +#ifndef V8_COMPILER_BYTECODE_GRAPH_BUILDER_H_ | 
| +#define V8_COMPILER_BYTECODE_GRAPH_BUILDER_H_ | 
| + | 
| +#include "src/compiler.h" | 
| +#include "src/compiler/js-graph.h" | 
| +#include "src/interpreter/bytecode-array-iterator.h" | 
| +#include "src/interpreter/bytecodes.h" | 
| + | 
| +namespace v8 { | 
| +namespace internal { | 
| +namespace compiler { | 
| + | 
| +// The BytecodeGraphBuilder produces a high-level IR graph based on | 
| +// interpreter bytecodes. | 
| +class BytecodeGraphBuilder { | 
| + public: | 
| +  BytecodeGraphBuilder(Zone* local_zone, CompilationInfo* info, | 
| +                       JSGraph* jsgraph); | 
| + | 
| +  // Creates a graph by visiting bytecodes. | 
| +  bool CreateGraph(bool stack_check = true); | 
| + | 
| +  Graph* graph() const { return jsgraph_->graph(); } | 
| + | 
| + private: | 
| +  class Environment; | 
| + | 
| +  void CreateGraphBody(bool stack_check); | 
| +  void VisitBytecodes(); | 
| + | 
| +  Node* LoadAccumulator(Node* value); | 
| + | 
| +  Node* GetFunctionContext(); | 
| + | 
| +  void set_environment(Environment* env) { environment_ = env; } | 
| +  const Environment* environment() const { return environment_; } | 
| +  Environment* environment() { return environment_; } | 
| + | 
| +  // Node creation helpers | 
| +  Node* NewNode(const Operator* op, bool incomplete = false) { | 
| +    return MakeNode(op, 0, static_cast<Node**>(NULL), incomplete); | 
| +  } | 
| + | 
| +  Node* NewNode(const Operator* op, Node* n1) { | 
| +    Node* buffer[] = {n1}; | 
| +    return MakeNode(op, arraysize(buffer), buffer, false); | 
| +  } | 
| + | 
| +  Node* NewNode(const Operator* op, Node* n1, Node* n2) { | 
| +    Node* buffer[] = {n1, n2}; | 
| +    return MakeNode(op, arraysize(buffer), buffer, false); | 
| +  } | 
| + | 
| +  Node* MakeNode(const Operator* op, int value_input_count, Node** value_inputs, | 
| +                 bool incomplete); | 
| + | 
| +  Node* MergeControl(Node* control, Node* other); | 
| + | 
| +  Node** EnsureInputBufferSize(int size); | 
| + | 
| +  void UpdateControlDependencyToLeaveFunction(Node* exit); | 
| + | 
| +  void BuildBinaryOp(const Operator* op, | 
| +                     const interpreter::BytecodeArrayIterator& iterator); | 
| + | 
| +  // Growth increment for the temporary buffer used to construct input lists to | 
| +  // new nodes. | 
| +  static const int kInputBufferSizeIncrement = 64; | 
| + | 
| +  // Field accessors | 
| +  CommonOperatorBuilder* common() const { return jsgraph_->common(); } | 
| +  Zone* graph_zone() const { return graph()->zone(); } | 
| +  CompilationInfo* info() const { return info_; } | 
| +  JSGraph* jsgraph() const { return jsgraph_; } | 
| +  JSOperatorBuilder* javascript() const { return jsgraph_->javascript(); } | 
| +  Zone* local_zone() const { return local_zone_; } | 
| +  const Handle<BytecodeArray>& bytecode_array() const { | 
| +    return bytecode_array_; | 
| +  } | 
| + | 
| +  LanguageMode language_mode() const { | 
| +    // TODO(oth): need to propagate language mode through | 
| +    return LanguageMode::SLOPPY; | 
| +  } | 
| + | 
| +#define DECLARE_VISIT_BYTECODE(name, ...) \ | 
| +  void Visit##name(const interpreter::BytecodeArrayIterator& iterator); | 
| +  BYTECODE_LIST(DECLARE_VISIT_BYTECODE) | 
| +#undef DECLARE_VISIT_BYTECODE | 
| + | 
| +  Zone* local_zone_; | 
| +  CompilationInfo* info_; | 
| +  JSGraph* jsgraph_; | 
| +  Handle<BytecodeArray> bytecode_array_; | 
| +  Environment* environment_; | 
| + | 
| +  // Temporary storage for building node input lists. | 
| +  int input_buffer_size_; | 
| +  Node** input_buffer_; | 
| + | 
| +  // Nodes representing values in the activation record. | 
| +  SetOncePointer<Node> function_context_; | 
| + | 
| +  // Control nodes that exit the function body. | 
| +  ZoneVector<Node*> exit_controls_; | 
| + | 
| +  DISALLOW_COPY_AND_ASSIGN(BytecodeGraphBuilder); | 
| +}; | 
| + | 
| + | 
| +class BytecodeGraphBuilder::Environment : public ZoneObject { | 
| + public: | 
| +  Environment(BytecodeGraphBuilder* builder, int register_count, | 
| +              int parameter_count, Node* control_dependency, Node* context); | 
| + | 
| +  int parameter_count() const { return parameter_count_; } | 
| +  int register_count() const { return register_count_; } | 
| + | 
| +  void BindRegister(interpreter::Register the_register, Node* node); | 
| +  Node* LookupRegister(interpreter::Register the_register) const; | 
| + | 
| +  void BindAccumulator(Node* node); | 
| +  Node* LookupAccumulator() const; | 
| + | 
| +  bool IsMarkedAsUnreachable() const; | 
| +  void MarkAsUnreachable(); | 
| + | 
| +  // Effect dependency tracked by this environment. | 
| +  Node* GetEffectDependency() { return effect_dependency_; } | 
| +  void UpdateEffectDependency(Node* dependency) { | 
| +    effect_dependency_ = dependency; | 
| +  } | 
| + | 
| +  // Control dependency tracked by this environment. | 
| +  Node* GetControlDependency() const { return control_dependency_; } | 
| +  void UpdateControlDependency(Node* dependency) { | 
| +    control_dependency_ = dependency; | 
| +  } | 
| + | 
| +  Node* Context() const { return context_; } | 
| + | 
| + private: | 
| +  int RegisterToValuesIndex(interpreter::Register the_register) const; | 
| + | 
| +  Zone* zone() const { return builder_->local_zone(); } | 
| +  Graph* graph() const { return builder_->graph(); } | 
| +  CommonOperatorBuilder* common() const { return builder_->common(); } | 
| +  BytecodeGraphBuilder* builder() const { return builder_; } | 
| +  const NodeVector* values() const { return &values_; } | 
| +  NodeVector* values() { return &values_; } | 
| +  Node* accumulator() { return accumulator_; } | 
| +  int register_base() const { return register_base_; } | 
| + | 
| +  BytecodeGraphBuilder* builder_; | 
| +  int register_count_; | 
| +  int parameter_count_; | 
| +  Node* accumulator_; | 
| +  Node* context_; | 
| +  Node* control_dependency_; | 
| +  Node* effect_dependency_; | 
| +  NodeVector values_; | 
| +  int register_base_; | 
| +}; | 
| + | 
| + | 
| +}  // namespace compiler | 
| +}  // namespace internal | 
| +}  // namespace v8 | 
| + | 
| +#endif  // V8_COMPILER_BYTECODE_GRAPH_BUILDER_H_ | 
|  |