Index: src/lithium.h |
=================================================================== |
--- src/lithium.h (revision 6270) |
+++ src/lithium.h (working copy) |
@@ -28,12 +28,16 @@ |
#ifndef V8_LITHIUM_H_ |
#define V8_LITHIUM_H_ |
+#include "hydrogen.h" |
#include "lithium-allocator.h" |
+#include "safepoint-table.h" |
namespace v8 { |
namespace internal { |
+class LCodeGen; |
class LGapNode; |
+class Translation; |
class LGapResolver BASE_EMBEDDED { |
public: |
@@ -78,6 +82,111 @@ |
}; |
+class LPointerMap: public ZoneObject { |
+ public: |
+ explicit LPointerMap(int position) |
+ : pointer_operands_(8), position_(position), lithium_position_(-1) { } |
+ |
+ const ZoneList<LOperand*>* operands() const { return &pointer_operands_; } |
+ int position() const { return position_; } |
+ int lithium_position() const { return lithium_position_; } |
+ |
+ void set_lithium_position(int pos) { |
+ ASSERT(lithium_position_ == -1); |
+ lithium_position_ = pos; |
+ } |
+ |
+ void RecordPointer(LOperand* op); |
+ void PrintTo(StringStream* stream); |
+ |
+ private: |
+ ZoneList<LOperand*> pointer_operands_; |
+ int position_; |
+ int lithium_position_; |
+}; |
+ |
+ |
+class LEnvironment: public ZoneObject { |
+ public: |
+ LEnvironment(Handle<JSFunction> closure, |
+ int ast_id, |
+ int parameter_count, |
+ int argument_count, |
+ int value_count, |
+ LEnvironment* outer) |
+ : closure_(closure), |
+ arguments_stack_height_(argument_count), |
+ deoptimization_index_(Safepoint::kNoDeoptimizationIndex), |
+ translation_index_(-1), |
+ ast_id_(ast_id), |
+ parameter_count_(parameter_count), |
+ values_(value_count), |
+ representations_(value_count), |
+ spilled_registers_(NULL), |
+ spilled_double_registers_(NULL), |
+ outer_(outer) { |
+ } |
+ |
+ Handle<JSFunction> closure() const { return closure_; } |
+ int arguments_stack_height() const { return arguments_stack_height_; } |
+ int deoptimization_index() const { return deoptimization_index_; } |
+ int translation_index() const { return translation_index_; } |
+ int ast_id() const { return ast_id_; } |
+ int parameter_count() const { return parameter_count_; } |
+ LOperand** spilled_registers() const { return spilled_registers_; } |
+ LOperand** spilled_double_registers() const { |
+ return spilled_double_registers_; |
+ } |
+ const ZoneList<LOperand*>* values() const { return &values_; } |
+ LEnvironment* outer() const { return outer_; } |
+ |
+ void AddValue(LOperand* operand, Representation representation) { |
+ values_.Add(operand); |
+ representations_.Add(representation); |
+ } |
+ |
+ bool HasTaggedValueAt(int index) const { |
+ return representations_[index].IsTagged(); |
+ } |
+ |
+ void Register(int deoptimization_index, int translation_index) { |
+ ASSERT(!HasBeenRegistered()); |
+ deoptimization_index_ = deoptimization_index; |
+ translation_index_ = translation_index; |
+ } |
+ bool HasBeenRegistered() const { |
+ return deoptimization_index_ != Safepoint::kNoDeoptimizationIndex; |
+ } |
+ |
+ void SetSpilledRegisters(LOperand** registers, |
+ LOperand** double_registers) { |
+ spilled_registers_ = registers; |
+ spilled_double_registers_ = double_registers; |
+ } |
+ |
+ void PrintTo(StringStream* stream); |
+ |
+ private: |
+ Handle<JSFunction> closure_; |
+ int arguments_stack_height_; |
+ int deoptimization_index_; |
+ int translation_index_; |
+ int ast_id_; |
+ int parameter_count_; |
+ ZoneList<LOperand*> values_; |
+ ZoneList<Representation> representations_; |
+ |
+ // Allocation index indexed arrays of spill slot operands for registers |
+ // that are also in spill slots at an OSR entry. NULL for environments |
+ // that do not correspond to an OSR entry. |
+ LOperand** spilled_registers_; |
+ LOperand** spilled_double_registers_; |
+ |
+ LEnvironment* outer_; |
+ |
+ friend class LCodegen; |
+}; |
+ |
} } // namespace v8::internal |
#endif // V8_LITHIUM_H_ |