Index: src/compiler/instruction.h |
diff --git a/src/compiler/instruction.h b/src/compiler/instruction.h |
index 5c052ac3c5d5de74bf3833d349852428e9de01f2..acb20b9b3d1d03680f12dc4f28364fa4e004c0cf 100644 |
--- a/src/compiler/instruction.h |
+++ b/src/compiler/instruction.h |
@@ -23,8 +23,10 @@ namespace v8 { |
namespace internal { |
namespace compiler { |
+// Forward declarations. |
class Schedule; |
+ |
class InstructionOperand { |
public: |
static const int kInvalidVirtualRegister = -1; |
@@ -105,6 +107,104 @@ class InstructionOperand { |
}; |
+typedef ZoneVector<InstructionOperand> InstructionOperandVector; |
+ |
+ |
+// Forward declarations. |
+class FrameStateDescriptor; |
+ |
+ |
+enum class StateValueKind { kPlain, kRecursive, kDuplicate }; |
+ |
+ |
+class StateValueDescriptor { |
+ public: |
+ explicit StateValueDescriptor(Zone* zone) |
+ : kind_(StateValueKind::kPlain), |
+ type_(kMachAnyTagged), |
+ id_(0), |
+ fields_(zone) {} |
+ |
+ static StateValueDescriptor Plain(Zone* zone, MachineType type) { |
+ return StateValueDescriptor(StateValueKind::kPlain, zone, type, 0); |
+ } |
+ static StateValueDescriptor Recursive(Zone* zone, size_t id) { |
+ return StateValueDescriptor(StateValueKind::kRecursive, zone, |
+ kMachAnyTagged, id); |
+ } |
+ static StateValueDescriptor Duplicate(Zone* zone, size_t id) { |
+ return StateValueDescriptor(StateValueKind::kDuplicate, zone, |
+ kMachAnyTagged, id); |
+ } |
+ |
+ size_t size() { return fields_.size(); } |
+ ZoneVector<StateValueDescriptor>& fields() { return fields_; } |
+ int IsPlain() { return kind_ == StateValueKind::kPlain; } |
+ int IsRecursive() { return kind_ == StateValueKind::kRecursive; } |
+ int IsDuplicate() { return kind_ == StateValueKind::kDuplicate; } |
+ MachineType type() const { return type_; } |
+ MachineType GetOperandType(size_t index) const { |
+ return fields_[index].type_; |
+ } |
+ size_t id() const { return id_; } |
+ |
+ private: |
+ StateValueDescriptor(StateValueKind kind, Zone* zone, MachineType type, |
+ size_t id) |
+ : kind_(kind), type_(type), id_(id), fields_(zone) {} |
+ |
+ StateValueKind kind_; |
+ MachineType type_; |
+ size_t id_; |
+ ZoneVector<StateValueDescriptor> fields_; |
+}; |
+ |
+ |
+class FrameStateDescriptor : public ZoneObject { |
+ public: |
+ FrameStateDescriptor(Zone* zone, FrameStateType type, BailoutId bailout_id, |
+ OutputFrameStateCombine state_combine, |
+ size_t parameters_count, size_t locals_count, |
+ size_t stack_count, |
+ MaybeHandle<SharedFunctionInfo> shared_info, |
+ FrameStateDescriptor* outer_state = nullptr); |
+ |
+ FrameStateType type() const { return type_; } |
+ BailoutId bailout_id() const { return bailout_id_; } |
+ OutputFrameStateCombine state_combine() const { return frame_state_combine_; } |
+ size_t parameters_count() const { return parameters_count_; } |
+ size_t locals_count() const { return locals_count_; } |
+ size_t stack_count() const { return stack_count_; } |
+ MaybeHandle<SharedFunctionInfo> shared_info() const { return shared_info_; } |
+ FrameStateDescriptor* outer_state() const { return outer_state_; } |
+ bool HasContext() const { |
+ return type_ == FrameStateType::kJavaScriptFunction; |
+ } |
+ |
+ size_t GetSize(OutputFrameStateCombine combine = |
+ OutputFrameStateCombine::Ignore()) const; |
+ size_t GetTotalSize() const; |
+ size_t GetFrameCount() const; |
+ size_t GetJSFrameCount() const; |
+ |
+ MachineType GetType(size_t index) const { |
+ return values_.GetOperandType(index); |
+ } |
+ StateValueDescriptor* GetStateValueDescriptor() { return &values_; } |
+ |
+ private: |
+ FrameStateType type_; |
+ BailoutId bailout_id_; |
+ OutputFrameStateCombine frame_state_combine_; |
+ size_t parameters_count_; |
+ size_t locals_count_; |
+ size_t stack_count_; |
+ StateValueDescriptor values_; |
+ MaybeHandle<SharedFunctionInfo> const shared_info_; |
+ FrameStateDescriptor* outer_state_; |
+}; |
+ |
+ |
struct PrintableInstructionOperand { |
const RegisterConfiguration* register_configuration_; |
InstructionOperand op_; |
@@ -928,48 +1028,6 @@ class Constant final { |
}; |
-class FrameStateDescriptor : public ZoneObject { |
- public: |
- FrameStateDescriptor(Zone* zone, FrameStateType type, BailoutId bailout_id, |
- OutputFrameStateCombine state_combine, |
- size_t parameters_count, size_t locals_count, |
- size_t stack_count, |
- MaybeHandle<SharedFunctionInfo> shared_info, |
- FrameStateDescriptor* outer_state = nullptr); |
- |
- FrameStateType type() const { return type_; } |
- BailoutId bailout_id() const { return bailout_id_; } |
- OutputFrameStateCombine state_combine() const { return frame_state_combine_; } |
- size_t parameters_count() const { return parameters_count_; } |
- size_t locals_count() const { return locals_count_; } |
- size_t stack_count() const { return stack_count_; } |
- MaybeHandle<SharedFunctionInfo> shared_info() const { return shared_info_; } |
- FrameStateDescriptor* outer_state() const { return outer_state_; } |
- bool HasContext() const { |
- return type_ == FrameStateType::kJavaScriptFunction; |
- } |
- |
- size_t GetSize(OutputFrameStateCombine combine = |
- OutputFrameStateCombine::Ignore()) const; |
- size_t GetTotalSize() const; |
- size_t GetFrameCount() const; |
- size_t GetJSFrameCount() const; |
- |
- MachineType GetType(size_t index) const; |
- void SetType(size_t index, MachineType type); |
- |
- private: |
- FrameStateType type_; |
- BailoutId bailout_id_; |
- OutputFrameStateCombine frame_state_combine_; |
- size_t parameters_count_; |
- size_t locals_count_; |
- size_t stack_count_; |
- ZoneVector<MachineType> types_; |
- MaybeHandle<SharedFunctionInfo> const shared_info_; |
- FrameStateDescriptor* outer_state_; |
-}; |
- |
std::ostream& operator<<(std::ostream& os, const Constant& constant); |