| Index: src/compiler/structured-machine-assembler.h
|
| diff --git a/src/compiler/structured-machine-assembler.h b/src/compiler/structured-machine-assembler.h
|
| deleted file mode 100644
|
| index 5f683a381c43b0b9bd6398c8bb522c5fd7beef45..0000000000000000000000000000000000000000
|
| --- a/src/compiler/structured-machine-assembler.h
|
| +++ /dev/null
|
| @@ -1,299 +0,0 @@
|
| -// Copyright 2014 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_STRUCTURED_MACHINE_ASSEMBLER_H_
|
| -#define V8_COMPILER_STRUCTURED_MACHINE_ASSEMBLER_H_
|
| -
|
| -#include "src/v8.h"
|
| -
|
| -#include "src/compiler/common-operator.h"
|
| -#include "src/compiler/graph-builder.h"
|
| -#include "src/compiler/machine-node-factory.h"
|
| -#include "src/compiler/machine-operator.h"
|
| -#include "src/compiler/node.h"
|
| -#include "src/compiler/operator.h"
|
| -
|
| -
|
| -namespace v8 {
|
| -namespace internal {
|
| -namespace compiler {
|
| -
|
| -class BasicBlock;
|
| -class Schedule;
|
| -class StructuredMachineAssembler;
|
| -
|
| -
|
| -class Variable : public ZoneObject {
|
| - public:
|
| - Node* Get() const;
|
| - void Set(Node* value) const;
|
| -
|
| - private:
|
| - Variable(StructuredMachineAssembler* smasm, int offset)
|
| - : smasm_(smasm), offset_(offset) {}
|
| -
|
| - friend class StructuredMachineAssembler;
|
| - friend class StructuredMachineAssemblerFriend;
|
| - StructuredMachineAssembler* const smasm_;
|
| - const int offset_;
|
| -};
|
| -
|
| -
|
| -class StructuredMachineAssembler
|
| - : public GraphBuilder,
|
| - public MachineNodeFactory<StructuredMachineAssembler> {
|
| - public:
|
| - class Environment : public ZoneObject {
|
| - public:
|
| - Environment(Zone* zone, BasicBlock* block, bool is_dead_);
|
| -
|
| - private:
|
| - BasicBlock* block_;
|
| - NodeVector variables_;
|
| - bool is_dead_;
|
| - friend class StructuredMachineAssembler;
|
| - DISALLOW_COPY_AND_ASSIGN(Environment);
|
| - };
|
| -
|
| - class IfBuilder;
|
| - friend class IfBuilder;
|
| - class LoopBuilder;
|
| - friend class LoopBuilder;
|
| -
|
| - StructuredMachineAssembler(Graph* graph, MachineSignature* machine_sig,
|
| - MachineType word = kMachPtr);
|
| - virtual ~StructuredMachineAssembler() {}
|
| -
|
| - Isolate* isolate() const { return zone()->isolate(); }
|
| - Zone* zone() const { return graph()->zone(); }
|
| - MachineOperatorBuilder* machine() { return &machine_; }
|
| - CommonOperatorBuilder* common() { return &common_; }
|
| - CallDescriptor* call_descriptor() const { return call_descriptor_; }
|
| - size_t parameter_count() const { return machine_sig_->parameter_count(); }
|
| - MachineSignature* machine_sig() const { return machine_sig_; }
|
| -
|
| - // Parameters.
|
| - Node* Parameter(size_t index);
|
| - // Variables.
|
| - Variable NewVariable(Node* initial_value);
|
| - // Control flow.
|
| - void Return(Node* value);
|
| -
|
| - // MachineAssembler is invalid after export.
|
| - Schedule* Export();
|
| -
|
| - protected:
|
| - virtual Node* MakeNode(Operator* op, int input_count, Node** inputs);
|
| -
|
| - Schedule* schedule() {
|
| - DCHECK(ScheduleValid());
|
| - return schedule_;
|
| - }
|
| -
|
| - private:
|
| - bool ScheduleValid() { return schedule_ != NULL; }
|
| -
|
| - typedef ZoneVector<Environment*> EnvironmentVector;
|
| -
|
| - NodeVector* CurrentVars() { return ¤t_environment_->variables_; }
|
| - Node*& VariableAt(Environment* environment, int offset);
|
| - Node* GetVariable(int offset);
|
| - void SetVariable(int offset, Node* value);
|
| -
|
| - void AddBranch(Environment* environment, Node* condition,
|
| - Environment* true_val, Environment* false_val);
|
| - void AddGoto(Environment* from, Environment* to);
|
| - BasicBlock* TrampolineFor(BasicBlock* block);
|
| -
|
| - void CopyCurrentAsDead();
|
| - Environment* Copy(Environment* environment) {
|
| - return Copy(environment, static_cast<int>(environment->variables_.size()));
|
| - }
|
| - Environment* Copy(Environment* environment, int truncate_at);
|
| - void Merge(EnvironmentVector* environments, int truncate_at);
|
| - Environment* CopyForLoopHeader(Environment* environment);
|
| - void MergeBackEdgesToLoopHeader(Environment* header,
|
| - EnvironmentVector* environments);
|
| -
|
| - Schedule* schedule_;
|
| - MachineOperatorBuilder machine_;
|
| - CommonOperatorBuilder common_;
|
| - MachineSignature* machine_sig_;
|
| - CallDescriptor* call_descriptor_;
|
| - Node** parameters_;
|
| - Environment* current_environment_;
|
| - int number_of_variables_;
|
| -
|
| - friend class Variable;
|
| - // For testing only.
|
| - friend class StructuredMachineAssemblerFriend;
|
| - DISALLOW_COPY_AND_ASSIGN(StructuredMachineAssembler);
|
| -};
|
| -
|
| -// IfBuilder constructs of nested if-else expressions which more or less follow
|
| -// C semantics. Foe example:
|
| -//
|
| -// if (x) {do_x} else if (y) {do_y} else {do_z}
|
| -//
|
| -// would look like this:
|
| -//
|
| -// IfBuilder b;
|
| -// b.If(x).Then();
|
| -// do_x
|
| -// b.Else();
|
| -// b.If().Then();
|
| -// do_y
|
| -// b.Else();
|
| -// do_z
|
| -// b.End();
|
| -//
|
| -// Then() and Else() can be skipped, representing an empty block in C.
|
| -// Combinations like If(x).Then().If(x).Then() are legitimate, but
|
| -// Else().Else() is not. That is, once you've nested an If(), you can't get to a
|
| -// higher level If() branch.
|
| -// TODO(dcarney): describe expressions once the api is finalized.
|
| -class StructuredMachineAssembler::IfBuilder {
|
| - public:
|
| - explicit IfBuilder(StructuredMachineAssembler* smasm);
|
| - ~IfBuilder() {
|
| - if (!IsDone()) End();
|
| - }
|
| -
|
| - IfBuilder& If(); // TODO(dcarney): this should take an expression.
|
| - IfBuilder& If(Node* condition);
|
| - void Then();
|
| - void Else();
|
| - void End();
|
| -
|
| - // The next 4 functions are exposed for expression support.
|
| - // They will be private once I have a nice expression api.
|
| - void And();
|
| - void Or();
|
| - IfBuilder& OpenParen() {
|
| - DCHECK(smasm_->current_environment_ != NULL);
|
| - CurrentClause()->PushNewExpressionState();
|
| - return *this;
|
| - }
|
| - IfBuilder& CloseParen() {
|
| - DCHECK(smasm_->current_environment_ == NULL);
|
| - CurrentClause()->PopExpressionState();
|
| - return *this;
|
| - }
|
| -
|
| - private:
|
| - // UnresolvedBranch represents the chain of environments created while
|
| - // generating an expression. At this point, a branch Node
|
| - // cannot be created, as the target environments of the branch are not yet
|
| - // available, so everything required to create the branch Node is
|
| - // stored in this structure until the target environments are resolved.
|
| - struct UnresolvedBranch : public ZoneObject {
|
| - UnresolvedBranch(Environment* environment, Node* condition,
|
| - UnresolvedBranch* next)
|
| - : environment_(environment), condition_(condition), next_(next) {}
|
| - // environment_ will eventually be terminated by a branch on condition_.
|
| - Environment* environment_;
|
| - Node* condition_;
|
| - // next_ is the next link in the UnresolvedBranch chain, and will be
|
| - // either the true or false branch jumped to from environment_.
|
| - UnresolvedBranch* next_;
|
| - };
|
| -
|
| - struct ExpressionState {
|
| - int pending_then_size_;
|
| - int pending_else_size_;
|
| - };
|
| -
|
| - typedef ZoneVector<ExpressionState> ExpressionStates;
|
| - typedef ZoneVector<UnresolvedBranch*> PendingMergeStack;
|
| - struct IfClause;
|
| - typedef ZoneVector<IfClause*> IfClauses;
|
| -
|
| - struct PendingMergeStackRange {
|
| - PendingMergeStack* merge_stack_;
|
| - int start_;
|
| - int size_;
|
| - };
|
| -
|
| - enum CombineType { kCombineThen, kCombineElse };
|
| - enum ResolutionType { kExpressionTerm, kExpressionDone };
|
| -
|
| - // IfClause represents one level of if-then-else nesting plus the associated
|
| - // expression.
|
| - // A call to If() triggers creation of a new nesting level after expression
|
| - // creation is complete - ie Then() or Else() has been called.
|
| - struct IfClause : public ZoneObject {
|
| - IfClause(Zone* zone, int initial_environment_size);
|
| - void CopyEnvironments(const PendingMergeStackRange& data,
|
| - EnvironmentVector* environments);
|
| - void ResolvePendingMerges(StructuredMachineAssembler* smasm,
|
| - CombineType combine_type,
|
| - ResolutionType resolution_type);
|
| - PendingMergeStackRange ComputeRelevantMerges(CombineType combine_type);
|
| - void FinalizeBranches(StructuredMachineAssembler* smasm,
|
| - const PendingMergeStackRange& offset_data,
|
| - CombineType combine_type,
|
| - Environment* then_environment,
|
| - Environment* else_environment);
|
| - void PushNewExpressionState();
|
| - void PopExpressionState();
|
| -
|
| - // Each invocation of And or Or creates a new UnresolvedBranch.
|
| - // These form a singly-linked list, of which we only need to keep track of
|
| - // the tail. On creation of an UnresolvedBranch, pending_then_merges_ and
|
| - // pending_else_merges_ each push a copy, which are removed on merges to the
|
| - // respective environment.
|
| - UnresolvedBranch* unresolved_list_tail_;
|
| - int initial_environment_size_;
|
| - // expression_states_ keeps track of the state of pending_*_merges_,
|
| - // pushing and popping the lengths of these on
|
| - // OpenParend() and CloseParend() respectively.
|
| - ExpressionStates expression_states_;
|
| - PendingMergeStack pending_then_merges_;
|
| - PendingMergeStack pending_else_merges_;
|
| - // then_environment_ is created iff there is a call to Then(), otherwise
|
| - // branches which would merge to it merge to the exit environment instead.
|
| - // Likewise for else_environment_.
|
| - Environment* then_environment_;
|
| - Environment* else_environment_;
|
| - };
|
| -
|
| - IfClause* CurrentClause() { return if_clauses_.back(); }
|
| - void AddCurrentToPending();
|
| - void PushNewIfClause();
|
| - bool IsDone() { return if_clauses_.empty(); }
|
| -
|
| - StructuredMachineAssembler* smasm_;
|
| - IfClauses if_clauses_;
|
| - EnvironmentVector pending_exit_merges_;
|
| - DISALLOW_COPY_AND_ASSIGN(IfBuilder);
|
| -};
|
| -
|
| -
|
| -class StructuredMachineAssembler::LoopBuilder {
|
| - public:
|
| - explicit LoopBuilder(StructuredMachineAssembler* smasm);
|
| - ~LoopBuilder() {
|
| - if (!IsDone()) End();
|
| - }
|
| -
|
| - void Break();
|
| - void Continue();
|
| - void End();
|
| -
|
| - private:
|
| - friend class StructuredMachineAssembler;
|
| - bool IsDone() { return header_environment_ == NULL; }
|
| -
|
| - StructuredMachineAssembler* smasm_;
|
| - Environment* header_environment_;
|
| - EnvironmentVector pending_header_merges_;
|
| - EnvironmentVector pending_exit_merges_;
|
| - DISALLOW_COPY_AND_ASSIGN(LoopBuilder);
|
| -};
|
| -
|
| -} // namespace compiler
|
| -} // namespace internal
|
| -} // namespace v8
|
| -
|
| -#endif // V8_COMPILER_STRUCTURED_MACHINE_ASSEMBLER_H_
|
|
|