OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
91 public: | 91 public: |
92 virtual ~OptimizedFunctionFilter() {} | 92 virtual ~OptimizedFunctionFilter() {} |
93 | 93 |
94 virtual bool TakeFunction(JSFunction* function) = 0; | 94 virtual bool TakeFunction(JSFunction* function) = 0; |
95 }; | 95 }; |
96 | 96 |
97 | 97 |
98 class Deoptimizer; | 98 class Deoptimizer; |
99 | 99 |
100 | 100 |
101 class DeoptimizerData { | |
102 public: | |
103 explicit DeoptimizerData(MemoryAllocator* allocator); | |
104 ~DeoptimizerData(); | |
105 | |
106 #ifdef ENABLE_DEBUGGER_SUPPORT | |
107 void Iterate(ObjectVisitor* v); | |
108 #endif | |
109 | |
110 Code* FindDeoptimizingCode(Address addr); | |
111 void RemoveDeoptimizingCode(Code* code); | |
112 | |
113 private: | |
114 MemoryAllocator* allocator_; | |
115 int eager_deoptimization_entry_code_entries_; | |
116 int lazy_deoptimization_entry_code_entries_; | |
117 MemoryChunk* eager_deoptimization_entry_code_; | |
118 MemoryChunk* lazy_deoptimization_entry_code_; | |
119 Deoptimizer* current_; | |
120 | |
121 #ifdef ENABLE_DEBUGGER_SUPPORT | |
122 DeoptimizedFrameInfo* deoptimized_frame_info_; | |
123 #endif | |
124 | |
125 // List of deoptimized code which still have references from active stack | |
126 // frames. These code objects are needed by the deoptimizer when deoptimizing | |
127 // a frame for which the code object for the function function has been | |
128 // changed from the code present when deoptimizing was done. | |
129 DeoptimizingCodeListNode* deoptimizing_code_list_; | |
130 | |
131 friend class Deoptimizer; | |
132 | |
133 DISALLOW_COPY_AND_ASSIGN(DeoptimizerData); | |
134 }; | |
135 | |
136 | |
137 class Deoptimizer : public Malloced { | 101 class Deoptimizer : public Malloced { |
138 public: | 102 public: |
139 enum BailoutType { | 103 enum BailoutType { |
140 EAGER, | 104 EAGER, |
141 LAZY, | 105 LAZY, |
| 106 SOFT, |
142 OSR, | 107 OSR, |
143 // This last bailout type is not really a bailout, but used by the | 108 // This last bailout type is not really a bailout, but used by the |
144 // debugger to deoptimize stack frames to allow inspection. | 109 // debugger to deoptimize stack frames to allow inspection. |
145 DEBUGGER | 110 DEBUGGER |
146 }; | 111 }; |
147 | 112 |
| 113 static const int kBailoutTypesWithCodeEntry = SOFT + 1; |
| 114 |
| 115 struct JumpTableEntry { |
| 116 inline JumpTableEntry(Address entry, |
| 117 Deoptimizer::BailoutType type, |
| 118 bool frame) |
| 119 : label(), |
| 120 address(entry), |
| 121 bailout_type(type), |
| 122 needs_frame(frame) { } |
| 123 Label label; |
| 124 Address address; |
| 125 Deoptimizer::BailoutType bailout_type; |
| 126 bool needs_frame; |
| 127 }; |
| 128 |
148 static bool TraceEnabledFor(BailoutType deopt_type, | 129 static bool TraceEnabledFor(BailoutType deopt_type, |
149 StackFrame::Type frame_type); | 130 StackFrame::Type frame_type); |
150 static const char* MessageFor(BailoutType type); | 131 static const char* MessageFor(BailoutType type); |
151 | 132 |
152 int output_count() const { return output_count_; } | 133 int output_count() const { return output_count_; } |
153 | 134 |
154 Code::Kind compiled_code_kind() const { return compiled_code_->kind(); } | 135 Code::Kind compiled_code_kind() const { return compiled_code_->kind(); } |
155 | 136 |
156 // Number of created JS frames. Not all created frames are necessarily JS. | 137 // Number of created JS frames. Not all created frames are necessarily JS. |
157 int jsframe_count() const { return jsframe_count_; } | 138 int jsframe_count() const { return jsframe_count_; } |
(...skipping 461 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
619 intptr_t* GetFrameSlotPointer(unsigned offset) { | 600 intptr_t* GetFrameSlotPointer(unsigned offset) { |
620 ASSERT(offset < frame_size_); | 601 ASSERT(offset < frame_size_); |
621 return reinterpret_cast<intptr_t*>( | 602 return reinterpret_cast<intptr_t*>( |
622 reinterpret_cast<Address>(this) + frame_content_offset() + offset); | 603 reinterpret_cast<Address>(this) + frame_content_offset() + offset); |
623 } | 604 } |
624 | 605 |
625 int ComputeFixedSize(); | 606 int ComputeFixedSize(); |
626 }; | 607 }; |
627 | 608 |
628 | 609 |
| 610 class DeoptimizerData { |
| 611 public: |
| 612 explicit DeoptimizerData(MemoryAllocator* allocator); |
| 613 ~DeoptimizerData(); |
| 614 |
| 615 #ifdef ENABLE_DEBUGGER_SUPPORT |
| 616 void Iterate(ObjectVisitor* v); |
| 617 #endif |
| 618 |
| 619 Code* FindDeoptimizingCode(Address addr); |
| 620 void RemoveDeoptimizingCode(Code* code); |
| 621 |
| 622 private: |
| 623 MemoryAllocator* allocator_; |
| 624 int deopt_entry_code_entries_[Deoptimizer::kBailoutTypesWithCodeEntry]; |
| 625 MemoryChunk* deopt_entry_code_[Deoptimizer::kBailoutTypesWithCodeEntry]; |
| 626 Deoptimizer* current_; |
| 627 |
| 628 #ifdef ENABLE_DEBUGGER_SUPPORT |
| 629 DeoptimizedFrameInfo* deoptimized_frame_info_; |
| 630 #endif |
| 631 |
| 632 // List of deoptimized code which still have references from active stack |
| 633 // frames. These code objects are needed by the deoptimizer when deoptimizing |
| 634 // a frame for which the code object for the function function has been |
| 635 // changed from the code present when deoptimizing was done. |
| 636 DeoptimizingCodeListNode* deoptimizing_code_list_; |
| 637 |
| 638 friend class Deoptimizer; |
| 639 |
| 640 DISALLOW_COPY_AND_ASSIGN(DeoptimizerData); |
| 641 }; |
| 642 |
| 643 |
629 class TranslationBuffer BASE_EMBEDDED { | 644 class TranslationBuffer BASE_EMBEDDED { |
630 public: | 645 public: |
631 explicit TranslationBuffer(Zone* zone) : contents_(256, zone) { } | 646 explicit TranslationBuffer(Zone* zone) : contents_(256, zone) { } |
632 | 647 |
633 int CurrentIndex() const { return contents_.length(); } | 648 int CurrentIndex() const { return contents_.length(); } |
634 void Add(int32_t value, Zone* zone); | 649 void Add(int32_t value, Zone* zone); |
635 | 650 |
636 Handle<ByteArray> CreateByteArray(Factory* factory); | 651 Handle<ByteArray> CreateByteArray(Factory* factory); |
637 | 652 |
638 private: | 653 private: |
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
917 Object** expression_stack_; | 932 Object** expression_stack_; |
918 int source_position_; | 933 int source_position_; |
919 | 934 |
920 friend class Deoptimizer; | 935 friend class Deoptimizer; |
921 }; | 936 }; |
922 #endif | 937 #endif |
923 | 938 |
924 } } // namespace v8::internal | 939 } } // namespace v8::internal |
925 | 940 |
926 #endif // V8_DEOPTIMIZER_H_ | 941 #endif // V8_DEOPTIMIZER_H_ |
OLD | NEW |