| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef V8_DEOPTIMIZER_H_ | 5 #ifndef V8_DEOPTIMIZER_H_ |
| 6 #define V8_DEOPTIMIZER_H_ | 6 #define V8_DEOPTIMIZER_H_ |
| 7 | 7 |
| 8 #include "src/allocation.h" | 8 #include "src/allocation.h" |
| 9 #include "src/macro-assembler.h" | 9 #include "src/macro-assembler.h" |
| 10 | 10 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 32 private: | 32 private: |
| 33 friend class TranslatedState; | 33 friend class TranslatedState; |
| 34 friend class TranslatedFrame; | 34 friend class TranslatedFrame; |
| 35 | 35 |
| 36 enum Kind { | 36 enum Kind { |
| 37 kInvalid, | 37 kInvalid, |
| 38 kTagged, | 38 kTagged, |
| 39 kInt32, | 39 kInt32, |
| 40 kUInt32, | 40 kUInt32, |
| 41 kBoolBit, | 41 kBoolBit, |
| 42 kFloat, |
| 42 kDouble, | 43 kDouble, |
| 43 kCapturedObject, // Object captured by the escape analysis. | 44 kCapturedObject, // Object captured by the escape analysis. |
| 44 // The number of nested objects can be obtained | 45 // The number of nested objects can be obtained |
| 45 // with the DeferredObjectLength() method | 46 // with the DeferredObjectLength() method |
| 46 // (the values of the nested objects follow | 47 // (the values of the nested objects follow |
| 47 // this value in the depth-first order.) | 48 // this value in the depth-first order.) |
| 48 kDuplicatedObject, // Duplicated object of a deferred object. | 49 kDuplicatedObject, // Duplicated object of a deferred object. |
| 49 kArgumentsObject // Arguments object - only used to keep indexing | 50 kArgumentsObject // Arguments object - only used to keep indexing |
| 50 // in sync, it should not be materialized. | 51 // in sync, it should not be materialized. |
| 51 }; | 52 }; |
| 52 | 53 |
| 53 TranslatedValue(TranslatedState* container, Kind kind) | 54 TranslatedValue(TranslatedState* container, Kind kind) |
| 54 : kind_(kind), container_(container) {} | 55 : kind_(kind), container_(container) {} |
| 55 Kind kind() const { return kind_; } | 56 Kind kind() const { return kind_; } |
| 56 void Handlify(); | 57 void Handlify(); |
| 57 int GetChildrenCount() const; | 58 int GetChildrenCount() const; |
| 58 | 59 |
| 59 static TranslatedValue NewArgumentsObject(TranslatedState* container, | 60 static TranslatedValue NewArgumentsObject(TranslatedState* container, |
| 60 int length, int object_index); | 61 int length, int object_index); |
| 61 static TranslatedValue NewDeferredObject(TranslatedState* container, | 62 static TranslatedValue NewDeferredObject(TranslatedState* container, |
| 62 int length, int object_index); | 63 int length, int object_index); |
| 63 static TranslatedValue NewDuplicateObject(TranslatedState* container, int id); | 64 static TranslatedValue NewDuplicateObject(TranslatedState* container, int id); |
| 65 static TranslatedValue NewFloat(TranslatedState* container, float value); |
| 64 static TranslatedValue NewDouble(TranslatedState* container, double value); | 66 static TranslatedValue NewDouble(TranslatedState* container, double value); |
| 65 static TranslatedValue NewInt32(TranslatedState* container, int32_t value); | 67 static TranslatedValue NewInt32(TranslatedState* container, int32_t value); |
| 66 static TranslatedValue NewUInt32(TranslatedState* container, uint32_t value); | 68 static TranslatedValue NewUInt32(TranslatedState* container, uint32_t value); |
| 67 static TranslatedValue NewBool(TranslatedState* container, uint32_t value); | 69 static TranslatedValue NewBool(TranslatedState* container, uint32_t value); |
| 68 static TranslatedValue NewTagged(TranslatedState* container, Object* literal); | 70 static TranslatedValue NewTagged(TranslatedState* container, Object* literal); |
| 69 static TranslatedValue NewInvalid(TranslatedState* container); | 71 static TranslatedValue NewInvalid(TranslatedState* container); |
| 70 | 72 |
| 71 Isolate* isolate() const; | 73 Isolate* isolate() const; |
| 72 void MaterializeSimple(); | 74 void MaterializeSimple(); |
| 73 | 75 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 86 int length_; // Applies only to kArgumentsObject or kCapturedObject kinds. | 88 int length_; // Applies only to kArgumentsObject or kCapturedObject kinds. |
| 87 }; | 89 }; |
| 88 | 90 |
| 89 union { | 91 union { |
| 90 // kind kTagged. After handlification it is always nullptr. | 92 // kind kTagged. After handlification it is always nullptr. |
| 91 Object* raw_literal_; | 93 Object* raw_literal_; |
| 92 // kind is kUInt32 or kBoolBit. | 94 // kind is kUInt32 or kBoolBit. |
| 93 uint32_t uint32_value_; | 95 uint32_t uint32_value_; |
| 94 // kind is kInt32. | 96 // kind is kInt32. |
| 95 int32_t int32_value_; | 97 int32_t int32_value_; |
| 98 // kind is kFloat |
| 99 float float_value_; |
| 96 // kind is kDouble | 100 // kind is kDouble |
| 97 double double_value_; | 101 double double_value_; |
| 98 // kind is kDuplicatedObject or kArgumentsObject or kCapturedObject. | 102 // kind is kDuplicatedObject or kArgumentsObject or kCapturedObject. |
| 99 MaterializedObjectInfo materialization_info_; | 103 MaterializedObjectInfo materialization_info_; |
| 100 }; | 104 }; |
| 101 | 105 |
| 102 // Checked accessors for the union members. | 106 // Checked accessors for the union members. |
| 103 Object* raw_literal() const; | 107 Object* raw_literal() const; |
| 104 int32_t int32_value() const; | 108 int32_t int32_value() const; |
| 105 uint32_t uint32_value() const; | 109 uint32_t uint32_value() const; |
| 110 float float_value() const; |
| 106 double double_value() const; | 111 double double_value() const; |
| 107 int object_length() const; | 112 int object_length() const; |
| 108 int object_index() const; | 113 int object_index() const; |
| 109 }; | 114 }; |
| 110 | 115 |
| 111 | 116 |
| 112 class TranslatedFrame { | 117 class TranslatedFrame { |
| 113 public: | 118 public: |
| 114 enum Kind { | 119 enum Kind { |
| 115 kFunction, | 120 kFunction, |
| (...skipping 615 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 731 // improperly detects an array bounds overflow in optimized debug builds | 736 // improperly detects an array bounds overflow in optimized debug builds |
| 732 // when using a plain DCHECK. | 737 // when using a plain DCHECK. |
| 733 if (n >= arraysize(registers_)) { | 738 if (n >= arraysize(registers_)) { |
| 734 DCHECK(false); | 739 DCHECK(false); |
| 735 return 0; | 740 return 0; |
| 736 } | 741 } |
| 737 #endif | 742 #endif |
| 738 return registers_[n]; | 743 return registers_[n]; |
| 739 } | 744 } |
| 740 | 745 |
| 746 float GetFloatRegister(unsigned n) const { |
| 747 DCHECK(n < arraysize(float_registers_)); |
| 748 return float_registers_[n]; |
| 749 } |
| 750 |
| 741 double GetDoubleRegister(unsigned n) const { | 751 double GetDoubleRegister(unsigned n) const { |
| 742 DCHECK(n < arraysize(double_registers_)); | 752 DCHECK(n < arraysize(double_registers_)); |
| 743 return double_registers_[n]; | 753 return double_registers_[n]; |
| 744 } | 754 } |
| 745 | 755 |
| 746 void SetRegister(unsigned n, intptr_t value) { | 756 void SetRegister(unsigned n, intptr_t value) { |
| 747 DCHECK(n < arraysize(registers_)); | 757 DCHECK(n < arraysize(registers_)); |
| 748 registers_[n] = value; | 758 registers_[n] = value; |
| 749 } | 759 } |
| 750 | 760 |
| 761 void SetFloatRegister(unsigned n, float value) { |
| 762 DCHECK(n < arraysize(float_registers_)); |
| 763 float_registers_[n] = value; |
| 764 } |
| 765 |
| 751 void SetDoubleRegister(unsigned n, double value) { | 766 void SetDoubleRegister(unsigned n, double value) { |
| 752 DCHECK(n < arraysize(double_registers_)); | 767 DCHECK(n < arraysize(double_registers_)); |
| 753 double_registers_[n] = value; | 768 double_registers_[n] = value; |
| 754 } | 769 } |
| 755 | 770 |
| 756 intptr_t registers_[Register::kNumRegisters]; | 771 intptr_t registers_[Register::kNumRegisters]; |
| 772 float float_registers_[FloatRegister::kMaxNumRegisters]; |
| 757 double double_registers_[DoubleRegister::kMaxNumRegisters]; | 773 double double_registers_[DoubleRegister::kMaxNumRegisters]; |
| 758 }; | 774 }; |
| 759 | 775 |
| 760 | 776 |
| 761 class FrameDescription { | 777 class FrameDescription { |
| 762 public: | 778 public: |
| 763 explicit FrameDescription(uint32_t frame_size, int parameter_count = 0); | 779 explicit FrameDescription(uint32_t frame_size, int parameter_count = 0); |
| 764 | 780 |
| 765 void* operator new(size_t size, uint32_t frame_size) { | 781 void* operator new(size_t size, uint32_t frame_size) { |
| 766 // Subtracts kPointerSize, as the member frame_content_ already supplies | 782 // Subtracts kPointerSize, as the member frame_content_ already supplies |
| (...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 970 V(ARGUMENTS_ADAPTOR_FRAME) \ | 986 V(ARGUMENTS_ADAPTOR_FRAME) \ |
| 971 V(TAIL_CALLER_FRAME) \ | 987 V(TAIL_CALLER_FRAME) \ |
| 972 V(COMPILED_STUB_FRAME) \ | 988 V(COMPILED_STUB_FRAME) \ |
| 973 V(DUPLICATED_OBJECT) \ | 989 V(DUPLICATED_OBJECT) \ |
| 974 V(ARGUMENTS_OBJECT) \ | 990 V(ARGUMENTS_OBJECT) \ |
| 975 V(CAPTURED_OBJECT) \ | 991 V(CAPTURED_OBJECT) \ |
| 976 V(REGISTER) \ | 992 V(REGISTER) \ |
| 977 V(INT32_REGISTER) \ | 993 V(INT32_REGISTER) \ |
| 978 V(UINT32_REGISTER) \ | 994 V(UINT32_REGISTER) \ |
| 979 V(BOOL_REGISTER) \ | 995 V(BOOL_REGISTER) \ |
| 996 V(FLOAT_REGISTER) \ |
| 980 V(DOUBLE_REGISTER) \ | 997 V(DOUBLE_REGISTER) \ |
| 981 V(STACK_SLOT) \ | 998 V(STACK_SLOT) \ |
| 982 V(INT32_STACK_SLOT) \ | 999 V(INT32_STACK_SLOT) \ |
| 983 V(UINT32_STACK_SLOT) \ | 1000 V(UINT32_STACK_SLOT) \ |
| 984 V(BOOL_STACK_SLOT) \ | 1001 V(BOOL_STACK_SLOT) \ |
| 1002 V(FLOAT_STACK_SLOT) \ |
| 985 V(DOUBLE_STACK_SLOT) \ | 1003 V(DOUBLE_STACK_SLOT) \ |
| 986 V(LITERAL) | 1004 V(LITERAL) |
| 987 | 1005 |
| 988 class Translation BASE_EMBEDDED { | 1006 class Translation BASE_EMBEDDED { |
| 989 public: | 1007 public: |
| 990 #define DECLARE_TRANSLATION_OPCODE_ENUM(item) item, | 1008 #define DECLARE_TRANSLATION_OPCODE_ENUM(item) item, |
| 991 enum Opcode { | 1009 enum Opcode { |
| 992 TRANSLATION_OPCODE_LIST(DECLARE_TRANSLATION_OPCODE_ENUM) | 1010 TRANSLATION_OPCODE_LIST(DECLARE_TRANSLATION_OPCODE_ENUM) |
| 993 LAST = LITERAL | 1011 LAST = LITERAL |
| 994 }; | 1012 }; |
| (...skipping 21 matching lines...) Expand all Loading... |
| 1016 void BeginConstructStubFrame(int literal_id, unsigned height); | 1034 void BeginConstructStubFrame(int literal_id, unsigned height); |
| 1017 void BeginGetterStubFrame(int literal_id); | 1035 void BeginGetterStubFrame(int literal_id); |
| 1018 void BeginSetterStubFrame(int literal_id); | 1036 void BeginSetterStubFrame(int literal_id); |
| 1019 void BeginArgumentsObject(int args_length); | 1037 void BeginArgumentsObject(int args_length); |
| 1020 void BeginCapturedObject(int length); | 1038 void BeginCapturedObject(int length); |
| 1021 void DuplicateObject(int object_index); | 1039 void DuplicateObject(int object_index); |
| 1022 void StoreRegister(Register reg); | 1040 void StoreRegister(Register reg); |
| 1023 void StoreInt32Register(Register reg); | 1041 void StoreInt32Register(Register reg); |
| 1024 void StoreUint32Register(Register reg); | 1042 void StoreUint32Register(Register reg); |
| 1025 void StoreBoolRegister(Register reg); | 1043 void StoreBoolRegister(Register reg); |
| 1044 void StoreFloatRegister(FloatRegister reg); |
| 1026 void StoreDoubleRegister(DoubleRegister reg); | 1045 void StoreDoubleRegister(DoubleRegister reg); |
| 1027 void StoreStackSlot(int index); | 1046 void StoreStackSlot(int index); |
| 1028 void StoreInt32StackSlot(int index); | 1047 void StoreInt32StackSlot(int index); |
| 1029 void StoreUint32StackSlot(int index); | 1048 void StoreUint32StackSlot(int index); |
| 1030 void StoreBoolStackSlot(int index); | 1049 void StoreBoolStackSlot(int index); |
| 1050 void StoreFloatStackSlot(int index); |
| 1031 void StoreDoubleStackSlot(int index); | 1051 void StoreDoubleStackSlot(int index); |
| 1032 void StoreLiteral(int literal_id); | 1052 void StoreLiteral(int literal_id); |
| 1033 void StoreArgumentsObject(bool args_known, int args_index, int args_length); | 1053 void StoreArgumentsObject(bool args_known, int args_index, int args_length); |
| 1034 void StoreJSFrameFunction(); | 1054 void StoreJSFrameFunction(); |
| 1035 | 1055 |
| 1036 Zone* zone() const { return zone_; } | 1056 Zone* zone() const { return zone_; } |
| 1037 | 1057 |
| 1038 static int NumberOfOperandsFor(Opcode opcode); | 1058 static int NumberOfOperandsFor(Opcode opcode); |
| 1039 | 1059 |
| 1040 #if defined(OBJECT_PRINT) || defined(ENABLE_DISASSEMBLER) | 1060 #if defined(OBJECT_PRINT) || defined(ENABLE_DISASSEMBLER) |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1134 std::vector<Handle<Object> > expression_stack_; | 1154 std::vector<Handle<Object> > expression_stack_; |
| 1135 int source_position_; | 1155 int source_position_; |
| 1136 | 1156 |
| 1137 friend class Deoptimizer; | 1157 friend class Deoptimizer; |
| 1138 }; | 1158 }; |
| 1139 | 1159 |
| 1140 } // namespace internal | 1160 } // namespace internal |
| 1141 } // namespace v8 | 1161 } // namespace v8 |
| 1142 | 1162 |
| 1143 #endif // V8_DEOPTIMIZER_H_ | 1163 #endif // V8_DEOPTIMIZER_H_ |
| OLD | NEW |