OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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 #include "src/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #include "src/accessors.h" | 7 #include "src/accessors.h" |
8 #include "src/codegen.h" | 8 #include "src/codegen.h" |
9 #include "src/cpu-profiler.h" | 9 #include "src/cpu-profiler.h" |
10 #include "src/deoptimizer.h" | 10 #include "src/deoptimizer.h" |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
147 | 147 |
148 // Locate the deoptimization point in the code. As we are at a call the | 148 // Locate the deoptimization point in the code. As we are at a call the |
149 // return address must be at a place in the code with deoptimization support. | 149 // return address must be at a place in the code with deoptimization support. |
150 SafepointEntry safepoint_entry = code->GetSafepointEntry(frame->pc()); | 150 SafepointEntry safepoint_entry = code->GetSafepointEntry(frame->pc()); |
151 int deoptimization_index = safepoint_entry.deoptimization_index(); | 151 int deoptimization_index = safepoint_entry.deoptimization_index(); |
152 CHECK_NE(deoptimization_index, Safepoint::kNoDeoptimizationIndex); | 152 CHECK_NE(deoptimization_index, Safepoint::kNoDeoptimizationIndex); |
153 | 153 |
154 // Always use the actual stack slots when calculating the fp to sp | 154 // Always use the actual stack slots when calculating the fp to sp |
155 // delta adding two for the function and context. | 155 // delta adding two for the function and context. |
156 unsigned stack_slots = code->stack_slots(); | 156 unsigned stack_slots = code->stack_slots(); |
| 157 unsigned arguments_stack_height = |
| 158 Deoptimizer::ComputeOutgoingArgumentSize(code, deoptimization_index); |
157 unsigned fp_to_sp_delta = (stack_slots * kPointerSize) + | 159 unsigned fp_to_sp_delta = (stack_slots * kPointerSize) + |
158 StandardFrameConstants::kFixedFrameSizeFromFp; | 160 StandardFrameConstants::kFixedFrameSizeFromFp + |
| 161 arguments_stack_height; |
159 | 162 |
160 Deoptimizer* deoptimizer = new Deoptimizer(isolate, | 163 Deoptimizer* deoptimizer = new Deoptimizer(isolate, |
161 function, | 164 function, |
162 Deoptimizer::DEBUGGER, | 165 Deoptimizer::DEBUGGER, |
163 deoptimization_index, | 166 deoptimization_index, |
164 frame->pc(), | 167 frame->pc(), |
165 fp_to_sp_delta, | 168 fp_to_sp_delta, |
166 code); | 169 code); |
167 Address tos = frame->fp() - fp_to_sp_delta; | 170 Address tos = frame->fp() - fp_to_sp_delta; |
168 deoptimizer->FillInputFrame(tos, frame); | 171 deoptimizer->FillInputFrame(tos, frame); |
(...skipping 1594 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1763 | 1766 |
1764 | 1767 |
1765 unsigned Deoptimizer::ComputeInputFrameSize() const { | 1768 unsigned Deoptimizer::ComputeInputFrameSize() const { |
1766 unsigned fixed_size = ComputeFixedSize(function_); | 1769 unsigned fixed_size = ComputeFixedSize(function_); |
1767 // The fp-to-sp delta already takes the context, constant pool pointer and the | 1770 // The fp-to-sp delta already takes the context, constant pool pointer and the |
1768 // function into account so we have to avoid double counting them. | 1771 // function into account so we have to avoid double counting them. |
1769 unsigned result = fixed_size + fp_to_sp_delta_ - | 1772 unsigned result = fixed_size + fp_to_sp_delta_ - |
1770 StandardFrameConstants::kFixedFrameSizeFromFp; | 1773 StandardFrameConstants::kFixedFrameSizeFromFp; |
1771 if (compiled_code_->kind() == Code::OPTIMIZED_FUNCTION) { | 1774 if (compiled_code_->kind() == Code::OPTIMIZED_FUNCTION) { |
1772 unsigned stack_slots = compiled_code_->stack_slots(); | 1775 unsigned stack_slots = compiled_code_->stack_slots(); |
1773 unsigned outgoing_size = ComputeOutgoingArgumentSize(); | 1776 unsigned outgoing_size = |
| 1777 ComputeOutgoingArgumentSize(compiled_code_, bailout_id_); |
1774 CHECK(result == fixed_size + (stack_slots * kPointerSize) + outgoing_size); | 1778 CHECK(result == fixed_size + (stack_slots * kPointerSize) + outgoing_size); |
1775 } | 1779 } |
1776 return result; | 1780 return result; |
1777 } | 1781 } |
1778 | 1782 |
1779 | 1783 |
1780 unsigned Deoptimizer::ComputeFixedSize(JSFunction* function) const { | 1784 unsigned Deoptimizer::ComputeFixedSize(JSFunction* function) const { |
1781 // The fixed part of the frame consists of the return address, frame | 1785 // The fixed part of the frame consists of the return address, frame |
1782 // pointer, function, context, and all the incoming arguments. | 1786 // pointer, function, context, and all the incoming arguments. |
1783 return ComputeIncomingArgumentSize(function) + | 1787 return ComputeIncomingArgumentSize(function) + |
1784 StandardFrameConstants::kFixedFrameSize; | 1788 StandardFrameConstants::kFixedFrameSize; |
1785 } | 1789 } |
1786 | 1790 |
1787 | 1791 |
1788 unsigned Deoptimizer::ComputeIncomingArgumentSize(JSFunction* function) const { | 1792 unsigned Deoptimizer::ComputeIncomingArgumentSize(JSFunction* function) const { |
1789 // The incoming arguments is the values for formal parameters and | 1793 // The incoming arguments is the values for formal parameters and |
1790 // the receiver. Every slot contains a pointer. | 1794 // the receiver. Every slot contains a pointer. |
1791 if (function->IsSmi()) { | 1795 if (function->IsSmi()) { |
1792 CHECK_EQ(Smi::cast(function), Smi::FromInt(StackFrame::STUB)); | 1796 CHECK_EQ(Smi::cast(function), Smi::FromInt(StackFrame::STUB)); |
1793 return 0; | 1797 return 0; |
1794 } | 1798 } |
1795 unsigned arguments = | 1799 unsigned arguments = |
1796 function->shared()->internal_formal_parameter_count() + 1; | 1800 function->shared()->internal_formal_parameter_count() + 1; |
1797 return arguments * kPointerSize; | 1801 return arguments * kPointerSize; |
1798 } | 1802 } |
1799 | 1803 |
1800 | 1804 |
1801 unsigned Deoptimizer::ComputeOutgoingArgumentSize() const { | 1805 // static |
| 1806 unsigned Deoptimizer::ComputeOutgoingArgumentSize(Code* code, |
| 1807 unsigned bailout_id) { |
1802 DeoptimizationInputData* data = | 1808 DeoptimizationInputData* data = |
1803 DeoptimizationInputData::cast(compiled_code_->deoptimization_data()); | 1809 DeoptimizationInputData::cast(code->deoptimization_data()); |
1804 unsigned height = data->ArgumentsStackHeight(bailout_id_)->value(); | 1810 unsigned height = data->ArgumentsStackHeight(bailout_id)->value(); |
1805 return height * kPointerSize; | 1811 return height * kPointerSize; |
1806 } | 1812 } |
1807 | 1813 |
1808 | 1814 |
1809 Object* Deoptimizer::ComputeLiteral(int index) const { | 1815 Object* Deoptimizer::ComputeLiteral(int index) const { |
1810 DeoptimizationInputData* data = | 1816 DeoptimizationInputData* data = |
1811 DeoptimizationInputData::cast(compiled_code_->deoptimization_data()); | 1817 DeoptimizationInputData::cast(compiled_code_->deoptimization_data()); |
1812 FixedArray* literals = data->LiteralArray(); | 1818 FixedArray* literals = data->LiteralArray(); |
1813 return literals->get(index); | 1819 return literals->get(index); |
1814 } | 1820 } |
(...skipping 1601 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3416 DCHECK(value_info->IsMaterializedObject()); | 3422 DCHECK(value_info->IsMaterializedObject()); |
3417 | 3423 |
3418 value_info->value_ = | 3424 value_info->value_ = |
3419 Handle<Object>(previously_materialized_objects->get(i), isolate_); | 3425 Handle<Object>(previously_materialized_objects->get(i), isolate_); |
3420 } | 3426 } |
3421 } | 3427 } |
3422 } | 3428 } |
3423 | 3429 |
3424 } // namespace internal | 3430 } // namespace internal |
3425 } // namespace v8 | 3431 } // namespace v8 |
OLD | NEW |