| 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/deoptimizer.h" | 5 #include "src/deoptimizer.h" |
| 6 | 6 |
| 7 #include "src/accessors.h" | 7 #include "src/accessors.h" |
| 8 #include "src/ast/prettyprinter.h" | 8 #include "src/ast/prettyprinter.h" |
| 9 #include "src/codegen.h" | 9 #include "src/codegen.h" |
| 10 #include "src/disasm.h" | 10 #include "src/disasm.h" |
| (...skipping 1315 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1326 unsigned height = translated_frame->height(); | 1326 unsigned height = translated_frame->height(); |
| 1327 unsigned height_in_bytes = height * kPointerSize; | 1327 unsigned height_in_bytes = height * kPointerSize; |
| 1328 JSFunction* function = JSFunction::cast(value_iterator->GetRawValue()); | 1328 JSFunction* function = JSFunction::cast(value_iterator->GetRawValue()); |
| 1329 value_iterator++; | 1329 value_iterator++; |
| 1330 input_index++; | 1330 input_index++; |
| 1331 if (trace_scope_ != NULL) { | 1331 if (trace_scope_ != NULL) { |
| 1332 PrintF(trace_scope_->file(), | 1332 PrintF(trace_scope_->file(), |
| 1333 " translating arguments adaptor => height=%d\n", height_in_bytes); | 1333 " translating arguments adaptor => height=%d\n", height_in_bytes); |
| 1334 } | 1334 } |
| 1335 | 1335 |
| 1336 unsigned fixed_frame_size = ArgumentsAdaptorFrameConstants::kFrameSize; | 1336 unsigned fixed_frame_size = ArgumentsAdaptorFrameConstants::kFixedFrameSize; |
| 1337 unsigned output_frame_size = height_in_bytes + fixed_frame_size; | 1337 unsigned output_frame_size = height_in_bytes + fixed_frame_size; |
| 1338 | 1338 |
| 1339 // Allocate and store the output frame description. | 1339 // Allocate and store the output frame description. |
| 1340 int parameter_count = height; | 1340 int parameter_count = height; |
| 1341 FrameDescription* output_frame = new (output_frame_size) | 1341 FrameDescription* output_frame = new (output_frame_size) |
| 1342 FrameDescription(output_frame_size, parameter_count); | 1342 FrameDescription(output_frame_size, parameter_count); |
| 1343 output_frame->SetFrameType(StackFrame::ARGUMENTS_ADAPTOR); | 1343 output_frame->SetFrameType(StackFrame::ARGUMENTS_ADAPTOR); |
| 1344 | 1344 |
| 1345 // Arguments adaptor can not be topmost or bottommost. | 1345 // Arguments adaptor can not be topmost or bottommost. |
| 1346 CHECK(frame_index > 0 && frame_index < output_count_ - 1); | 1346 CHECK(frame_index > 0 && frame_index < output_count_ - 1); |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1434 unsigned height = translated_frame->height(); | 1434 unsigned height = translated_frame->height(); |
| 1435 unsigned height_in_bytes = height * kPointerSize; | 1435 unsigned height_in_bytes = height * kPointerSize; |
| 1436 // Skip function. | 1436 // Skip function. |
| 1437 value_iterator++; | 1437 value_iterator++; |
| 1438 input_index++; | 1438 input_index++; |
| 1439 if (trace_scope_ != NULL) { | 1439 if (trace_scope_ != NULL) { |
| 1440 PrintF(trace_scope_->file(), | 1440 PrintF(trace_scope_->file(), |
| 1441 " translating construct stub => height=%d\n", height_in_bytes); | 1441 " translating construct stub => height=%d\n", height_in_bytes); |
| 1442 } | 1442 } |
| 1443 | 1443 |
| 1444 unsigned fixed_frame_size = ConstructFrameConstants::kFrameSize; | 1444 unsigned fixed_frame_size = ConstructFrameConstants::kFixedFrameSize; |
| 1445 unsigned output_frame_size = height_in_bytes + fixed_frame_size; | 1445 unsigned output_frame_size = height_in_bytes + fixed_frame_size; |
| 1446 | 1446 |
| 1447 // Allocate and store the output frame description. | 1447 // Allocate and store the output frame description. |
| 1448 FrameDescription* output_frame = | 1448 FrameDescription* output_frame = |
| 1449 new (output_frame_size) FrameDescription(output_frame_size); | 1449 new (output_frame_size) FrameDescription(output_frame_size); |
| 1450 output_frame->SetFrameType(StackFrame::CONSTRUCT); | 1450 output_frame->SetFrameType(StackFrame::CONSTRUCT); |
| 1451 | 1451 |
| 1452 // Construct stub can not be topmost or bottommost. | 1452 // Construct stub can not be topmost or bottommost. |
| 1453 DCHECK(frame_index > 0 && frame_index < output_count_ - 1); | 1453 DCHECK(frame_index > 0 && frame_index < output_count_ - 1); |
| 1454 DCHECK(output_[frame_index] == NULL); | 1454 DCHECK(output_[frame_index] == NULL); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1489 | 1489 |
| 1490 if (FLAG_enable_embedded_constant_pool) { | 1490 if (FLAG_enable_embedded_constant_pool) { |
| 1491 // Read the caller's constant pool from the previous frame. | 1491 // Read the caller's constant pool from the previous frame. |
| 1492 output_offset -= kPointerSize; | 1492 output_offset -= kPointerSize; |
| 1493 value = output_[frame_index - 1]->GetConstantPool(); | 1493 value = output_[frame_index - 1]->GetConstantPool(); |
| 1494 output_frame->SetCallerConstantPool(output_offset, value); | 1494 output_frame->SetCallerConstantPool(output_offset, value); |
| 1495 DebugPrintOutputSlot(value, frame_index, output_offset, | 1495 DebugPrintOutputSlot(value, frame_index, output_offset, |
| 1496 "caller's constant_pool\n"); | 1496 "caller's constant_pool\n"); |
| 1497 } | 1497 } |
| 1498 | 1498 |
| 1499 // A marker value is used to mark the frame. |
| 1500 output_offset -= kPointerSize; |
| 1501 value = reinterpret_cast<intptr_t>(Smi::FromInt(StackFrame::CONSTRUCT)); |
| 1502 output_frame->SetFrameSlot(output_offset, value); |
| 1503 DebugPrintOutputSlot(value, frame_index, output_offset, |
| 1504 "typed frame marker\n"); |
| 1505 |
| 1499 // The context can be gotten from the previous frame. | 1506 // The context can be gotten from the previous frame. |
| 1500 output_offset -= kPointerSize; | 1507 output_offset -= kPointerSize; |
| 1501 value = output_[frame_index - 1]->GetContext(); | 1508 value = output_[frame_index - 1]->GetContext(); |
| 1502 output_frame->SetFrameSlot(output_offset, value); | 1509 output_frame->SetFrameSlot(output_offset, value); |
| 1503 DebugPrintOutputSlot(value, frame_index, output_offset, "context\n"); | 1510 DebugPrintOutputSlot(value, frame_index, output_offset, "context\n"); |
| 1504 | 1511 |
| 1505 // A marker value is used in place of the function. | |
| 1506 output_offset -= kPointerSize; | |
| 1507 value = reinterpret_cast<intptr_t>(Smi::FromInt(StackFrame::CONSTRUCT)); | |
| 1508 output_frame->SetFrameSlot(output_offset, value); | |
| 1509 DebugPrintOutputSlot(value, frame_index, output_offset, | |
| 1510 "function (construct sentinel)\n"); | |
| 1511 | |
| 1512 // The output frame reflects a JSConstructStubGeneric frame. | |
| 1513 output_offset -= kPointerSize; | |
| 1514 value = reinterpret_cast<intptr_t>(construct_stub); | |
| 1515 output_frame->SetFrameSlot(output_offset, value); | |
| 1516 DebugPrintOutputSlot(value, frame_index, output_offset, "code object\n"); | |
| 1517 | |
| 1518 // The allocation site. | 1512 // The allocation site. |
| 1519 output_offset -= kPointerSize; | 1513 output_offset -= kPointerSize; |
| 1520 value = reinterpret_cast<intptr_t>(isolate_->heap()->undefined_value()); | 1514 value = reinterpret_cast<intptr_t>(isolate_->heap()->undefined_value()); |
| 1521 output_frame->SetFrameSlot(output_offset, value); | 1515 output_frame->SetFrameSlot(output_offset, value); |
| 1522 DebugPrintOutputSlot(value, frame_index, output_offset, "allocation site\n"); | 1516 DebugPrintOutputSlot(value, frame_index, output_offset, "allocation site\n"); |
| 1523 | 1517 |
| 1524 // Number of incoming arguments. | 1518 // Number of incoming arguments. |
| 1525 output_offset -= kPointerSize; | 1519 output_offset -= kPointerSize; |
| 1526 value = reinterpret_cast<intptr_t>(Smi::FromInt(height - 1)); | 1520 value = reinterpret_cast<intptr_t>(Smi::FromInt(height - 1)); |
| 1527 output_frame->SetFrameSlot(output_offset, value); | 1521 output_frame->SetFrameSlot(output_offset, value); |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1567 // frame. This means that we have to use a height of 0. | 1561 // frame. This means that we have to use a height of 0. |
| 1568 unsigned height = 0; | 1562 unsigned height = 0; |
| 1569 unsigned height_in_bytes = height * kPointerSize; | 1563 unsigned height_in_bytes = height * kPointerSize; |
| 1570 const char* kind = is_setter_stub_frame ? "setter" : "getter"; | 1564 const char* kind = is_setter_stub_frame ? "setter" : "getter"; |
| 1571 if (trace_scope_ != NULL) { | 1565 if (trace_scope_ != NULL) { |
| 1572 PrintF(trace_scope_->file(), | 1566 PrintF(trace_scope_->file(), |
| 1573 " translating %s stub => height=%u\n", kind, height_in_bytes); | 1567 " translating %s stub => height=%u\n", kind, height_in_bytes); |
| 1574 } | 1568 } |
| 1575 | 1569 |
| 1576 // We need 1 stack entry for the return address and enough entries for the | 1570 // We need 1 stack entry for the return address and enough entries for the |
| 1577 // StackFrame::INTERNAL (FP, context, frame type, code object and constant | 1571 // StackFrame::INTERNAL (FP, frame type, context, code object and constant |
| 1578 // pool (if enabled)- see MacroAssembler::EnterFrame). | 1572 // pool (if enabled)- see MacroAssembler::EnterFrame). |
| 1579 // For a setter stub frame we need one additional entry for the implicit | 1573 // For a setter stub frame we need one additional entry for the implicit |
| 1580 // return value, see StoreStubCompiler::CompileStoreViaSetter. | 1574 // return value, see StoreStubCompiler::CompileStoreViaSetter. |
| 1581 unsigned fixed_frame_entries = | 1575 unsigned fixed_frame_entries = |
| 1582 (StandardFrameConstants::kFixedFrameSize / kPointerSize) + 1 + | 1576 (StandardFrameConstants::kFixedFrameSize / kPointerSize) + 1 + |
| 1583 (is_setter_stub_frame ? 1 : 0); | 1577 (is_setter_stub_frame ? 1 : 0); |
| 1584 unsigned fixed_frame_size = fixed_frame_entries * kPointerSize; | 1578 unsigned fixed_frame_size = fixed_frame_entries * kPointerSize; |
| 1585 unsigned output_frame_size = height_in_bytes + fixed_frame_size; | 1579 unsigned output_frame_size = height_in_bytes + fixed_frame_size; |
| 1586 | 1580 |
| 1587 // Allocate and store the output frame description. | 1581 // Allocate and store the output frame description. |
| (...skipping 29 matching lines...) Expand all Loading... |
| 1617 | 1611 |
| 1618 if (FLAG_enable_embedded_constant_pool) { | 1612 if (FLAG_enable_embedded_constant_pool) { |
| 1619 // Read the caller's constant pool from the previous frame. | 1613 // Read the caller's constant pool from the previous frame. |
| 1620 output_offset -= kPointerSize; | 1614 output_offset -= kPointerSize; |
| 1621 value = output_[frame_index - 1]->GetConstantPool(); | 1615 value = output_[frame_index - 1]->GetConstantPool(); |
| 1622 output_frame->SetCallerConstantPool(output_offset, value); | 1616 output_frame->SetCallerConstantPool(output_offset, value); |
| 1623 DebugPrintOutputSlot(value, frame_index, output_offset, | 1617 DebugPrintOutputSlot(value, frame_index, output_offset, |
| 1624 "caller's constant_pool\n"); | 1618 "caller's constant_pool\n"); |
| 1625 } | 1619 } |
| 1626 | 1620 |
| 1627 // The context can be gotten from the previous frame. | 1621 // Set the frame type. |
| 1628 output_offset -= kPointerSize; | |
| 1629 value = output_[frame_index - 1]->GetContext(); | |
| 1630 output_frame->SetFrameSlot(output_offset, value); | |
| 1631 DebugPrintOutputSlot(value, frame_index, output_offset, "context\n"); | |
| 1632 | |
| 1633 // A marker value is used in place of the function. | |
| 1634 output_offset -= kPointerSize; | 1622 output_offset -= kPointerSize; |
| 1635 value = reinterpret_cast<intptr_t>(Smi::FromInt(StackFrame::INTERNAL)); | 1623 value = reinterpret_cast<intptr_t>(Smi::FromInt(StackFrame::INTERNAL)); |
| 1636 output_frame->SetFrameSlot(output_offset, value); | 1624 output_frame->SetFrameSlot(output_offset, value); |
| 1637 DebugPrintOutputSlot(value, frame_index, output_offset, "function "); | 1625 DebugPrintOutputSlot(value, frame_index, output_offset, "frame type "); |
| 1638 if (trace_scope_ != nullptr) { | 1626 if (trace_scope_ != nullptr) { |
| 1639 PrintF(trace_scope_->file(), "(%s sentinel)\n", kind); | 1627 PrintF(trace_scope_->file(), "(%s sentinel)\n", kind); |
| 1640 } | 1628 } |
| 1641 | 1629 |
| 1642 // Get Code object from accessor stub. | 1630 // Get Code object from accessor stub. |
| 1643 output_offset -= kPointerSize; | 1631 output_offset -= kPointerSize; |
| 1644 Builtins::Name name = is_setter_stub_frame ? | 1632 Builtins::Name name = is_setter_stub_frame ? |
| 1645 Builtins::kStoreIC_Setter_ForDeopt : | 1633 Builtins::kStoreIC_Setter_ForDeopt : |
| 1646 Builtins::kLoadIC_Getter_ForDeopt; | 1634 Builtins::kLoadIC_Getter_ForDeopt; |
| 1647 Code* accessor_stub = isolate_->builtins()->builtin(name); | 1635 Code* accessor_stub = isolate_->builtins()->builtin(name); |
| 1648 value = reinterpret_cast<intptr_t>(accessor_stub); | 1636 value = reinterpret_cast<intptr_t>(accessor_stub); |
| 1649 output_frame->SetFrameSlot(output_offset, value); | 1637 output_frame->SetFrameSlot(output_offset, value); |
| 1650 DebugPrintOutputSlot(value, frame_index, output_offset, "code object\n"); | 1638 DebugPrintOutputSlot(value, frame_index, output_offset, "code object\n"); |
| 1651 | 1639 |
| 1640 // The context can be gotten from the previous frame. |
| 1641 output_offset -= kPointerSize; |
| 1642 value = output_[frame_index - 1]->GetContext(); |
| 1643 output_frame->SetFrameSlot(output_offset, value); |
| 1644 DebugPrintOutputSlot(value, frame_index, output_offset, "context\n"); |
| 1645 |
| 1652 // Skip receiver. | 1646 // Skip receiver. |
| 1653 value_iterator++; | 1647 value_iterator++; |
| 1654 input_index++; | 1648 input_index++; |
| 1655 | 1649 |
| 1656 if (is_setter_stub_frame) { | 1650 if (is_setter_stub_frame) { |
| 1657 // The implicit return value was part of the artificial setter stub | 1651 // The implicit return value was part of the artificial setter stub |
| 1658 // environment. | 1652 // environment. |
| 1659 output_offset -= kPointerSize; | 1653 output_offset -= kPointerSize; |
| 1660 WriteTranslatedValueToOutput(&value_iterator, &input_index, frame_index, | 1654 WriteTranslatedValueToOutput(&value_iterator, &input_index, frame_index, |
| 1661 output_offset); | 1655 output_offset); |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1726 // and the standard stack frame slots. Include space for an argument | 1720 // and the standard stack frame slots. Include space for an argument |
| 1727 // object to the callee and optionally the space to pass the argument | 1721 // object to the callee and optionally the space to pass the argument |
| 1728 // object to the stub failure handler. | 1722 // object to the stub failure handler. |
| 1729 int param_count = descriptor.GetRegisterParameterCount(); | 1723 int param_count = descriptor.GetRegisterParameterCount(); |
| 1730 int stack_param_count = descriptor.GetStackParameterCount(); | 1724 int stack_param_count = descriptor.GetStackParameterCount(); |
| 1731 // The translated frame contains all of the register parameters | 1725 // The translated frame contains all of the register parameters |
| 1732 // plus the context. | 1726 // plus the context. |
| 1733 CHECK_EQ(translated_frame->height(), param_count + 1); | 1727 CHECK_EQ(translated_frame->height(), param_count + 1); |
| 1734 CHECK_GE(param_count, 0); | 1728 CHECK_GE(param_count, 0); |
| 1735 | 1729 |
| 1736 int height_in_bytes = kPointerSize * (param_count + stack_param_count) + | 1730 int height_in_bytes = kPointerSize * (param_count + stack_param_count); |
| 1737 sizeof(Arguments) + kPointerSize; | 1731 int fixed_frame_size = StubFailureTrampolineFrameConstants::kFixedFrameSize; |
| 1738 int fixed_frame_size = StandardFrameConstants::kFixedFrameSize; | |
| 1739 int input_frame_size = input_->GetFrameSize(); | 1732 int input_frame_size = input_->GetFrameSize(); |
| 1740 int output_frame_size = height_in_bytes + fixed_frame_size; | 1733 int output_frame_size = height_in_bytes + fixed_frame_size; |
| 1741 if (trace_scope_ != NULL) { | 1734 if (trace_scope_ != NULL) { |
| 1742 PrintF(trace_scope_->file(), | 1735 PrintF(trace_scope_->file(), |
| 1743 " translating %s => StubFailureTrampolineStub, height=%d\n", | 1736 " translating %s => StubFailureTrampolineStub, height=%d\n", |
| 1744 CodeStub::MajorName(static_cast<CodeStub::Major>(major_key)), | 1737 CodeStub::MajorName(static_cast<CodeStub::Major>(major_key)), |
| 1745 height_in_bytes); | 1738 height_in_bytes); |
| 1746 } | 1739 } |
| 1747 | 1740 |
| 1748 // The stub failure trampoline is a single frame. | 1741 // The stub failure trampoline is a single frame. |
| 1749 FrameDescription* output_frame = | 1742 FrameDescription* output_frame = |
| 1750 new (output_frame_size) FrameDescription(output_frame_size); | 1743 new (output_frame_size) FrameDescription(output_frame_size); |
| 1751 output_frame->SetFrameType(StackFrame::STUB_FAILURE_TRAMPOLINE); | 1744 output_frame->SetFrameType(StackFrame::STUB_FAILURE_TRAMPOLINE); |
| 1752 CHECK_EQ(frame_index, 0); | 1745 CHECK_EQ(frame_index, 0); |
| 1753 output_[frame_index] = output_frame; | 1746 output_[frame_index] = output_frame; |
| 1754 | 1747 |
| 1755 // The top address for the output frame can be computed from the input | 1748 // The top address for the output frame can be computed from the input |
| 1756 // frame pointer and the output frame's height. Subtract space for the | 1749 // frame pointer and the output frame's height. Subtract space for the |
| 1757 // context and function slots. | 1750 // context and function slots. |
| 1758 Register fp_reg = StubFailureTrampolineFrame::fp_register(); | 1751 Register fp_reg = StubFailureTrampolineFrame::fp_register(); |
| 1759 intptr_t top_address = input_->GetRegister(fp_reg.code()) - | 1752 intptr_t top_address = |
| 1760 StandardFrameConstants::kFixedFrameSizeFromFp - height_in_bytes; | 1753 input_->GetRegister(fp_reg.code()) - |
| 1754 StubFailureTrampolineFrameConstants::kFixedFrameSizeFromFp - |
| 1755 height_in_bytes; |
| 1761 output_frame->SetTop(top_address); | 1756 output_frame->SetTop(top_address); |
| 1762 | 1757 |
| 1763 // Read caller's PC (JSFunction continuation) from the input frame. | 1758 // Read caller's PC (JSFunction continuation) from the input frame. |
| 1764 unsigned input_frame_offset = input_frame_size - kPCOnStackSize; | 1759 unsigned input_frame_offset = input_frame_size - kPCOnStackSize; |
| 1765 unsigned output_frame_offset = output_frame_size - kFPOnStackSize; | 1760 unsigned output_frame_offset = output_frame_size - kFPOnStackSize; |
| 1766 intptr_t value = input_->GetFrameSlot(input_frame_offset); | 1761 intptr_t value = input_->GetFrameSlot(input_frame_offset); |
| 1767 output_frame->SetCallerPc(output_frame_offset, value); | 1762 output_frame->SetCallerPc(output_frame_offset, value); |
| 1768 DebugPrintOutputSlot(value, frame_index, output_frame_offset, | 1763 DebugPrintOutputSlot(value, frame_index, output_frame_offset, |
| 1769 "caller's pc\n"); | 1764 "caller's pc\n"); |
| 1770 | 1765 |
| 1771 // Read caller's FP from the input frame, and set this frame's FP. | 1766 // Read caller's FP from the input frame, and set this frame's FP. |
| 1772 input_frame_offset -= kFPOnStackSize; | 1767 input_frame_offset -= kFPOnStackSize; |
| 1773 value = input_->GetFrameSlot(input_frame_offset); | |
| 1774 output_frame_offset -= kFPOnStackSize; | 1768 output_frame_offset -= kFPOnStackSize; |
| 1775 output_frame->SetCallerFp(output_frame_offset, value); | 1769 intptr_t parent_frame_ptr = input_->GetFrameSlot(input_frame_offset); |
| 1770 output_frame->SetCallerFp(output_frame_offset, parent_frame_ptr); |
| 1776 intptr_t frame_ptr = input_->GetRegister(fp_reg.code()); | 1771 intptr_t frame_ptr = input_->GetRegister(fp_reg.code()); |
| 1777 output_frame->SetRegister(fp_reg.code(), frame_ptr); | 1772 output_frame->SetRegister(fp_reg.code(), frame_ptr); |
| 1778 output_frame->SetFp(frame_ptr); | 1773 output_frame->SetFp(frame_ptr); |
| 1779 DebugPrintOutputSlot(value, frame_index, output_frame_offset, | 1774 DebugPrintOutputSlot(frame_ptr, frame_index, output_frame_offset, |
| 1780 "caller's fp\n"); | 1775 "caller's fp\n"); |
| 1781 | 1776 |
| 1782 if (FLAG_enable_embedded_constant_pool) { | 1777 if (FLAG_enable_embedded_constant_pool) { |
| 1783 // Read the caller's constant pool from the input frame. | 1778 // Read the caller's constant pool from the input frame. |
| 1784 input_frame_offset -= kPointerSize; | 1779 input_frame_offset -= kPointerSize; |
| 1785 value = input_->GetFrameSlot(input_frame_offset); | 1780 value = input_->GetFrameSlot(input_frame_offset); |
| 1786 output_frame_offset -= kPointerSize; | 1781 output_frame_offset -= kPointerSize; |
| 1787 output_frame->SetCallerConstantPool(output_frame_offset, value); | 1782 output_frame->SetCallerConstantPool(output_frame_offset, value); |
| 1788 DebugPrintOutputSlot(value, frame_index, output_frame_offset, | 1783 DebugPrintOutputSlot(value, frame_index, output_frame_offset, |
| 1789 "caller's constant_pool\n"); | 1784 "caller's constant_pool\n"); |
| 1790 } | 1785 } |
| 1791 | 1786 |
| 1792 // Remember where the context will need to be written back from the deopt | 1787 // The marker for the typed stack frame |
| 1793 // translation. | |
| 1794 output_frame_offset -= kPointerSize; | |
| 1795 unsigned context_frame_offset = output_frame_offset; | |
| 1796 | |
| 1797 // A marker value is used in place of the function. | |
| 1798 output_frame_offset -= kPointerSize; | 1788 output_frame_offset -= kPointerSize; |
| 1799 value = reinterpret_cast<intptr_t>( | 1789 value = reinterpret_cast<intptr_t>( |
| 1800 Smi::FromInt(StackFrame::STUB_FAILURE_TRAMPOLINE)); | 1790 Smi::FromInt(StackFrame::STUB_FAILURE_TRAMPOLINE)); |
| 1801 output_frame->SetFrameSlot(output_frame_offset, value); | 1791 output_frame->SetFrameSlot(output_frame_offset, value); |
| 1802 DebugPrintOutputSlot(value, frame_index, output_frame_offset, | 1792 DebugPrintOutputSlot(value, frame_index, output_frame_offset, |
| 1803 "function (stub failure sentinel)\n"); | 1793 "function (stub failure sentinel)\n"); |
| 1804 | 1794 |
| 1805 intptr_t caller_arg_count = stack_param_count; | 1795 intptr_t caller_arg_count = stack_param_count; |
| 1806 bool arg_count_known = !descriptor.stack_parameter_count().is_valid(); | 1796 bool arg_count_known = !descriptor.stack_parameter_count().is_valid(); |
| 1807 | 1797 |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1848 .is(descriptor.stack_parameter_count())) { | 1838 .is(descriptor.stack_parameter_count())) { |
| 1849 arguments_length_offset = output_frame_offset; | 1839 arguments_length_offset = output_frame_offset; |
| 1850 } | 1840 } |
| 1851 } | 1841 } |
| 1852 | 1842 |
| 1853 Object* maybe_context = value_iterator->GetRawValue(); | 1843 Object* maybe_context = value_iterator->GetRawValue(); |
| 1854 CHECK(maybe_context->IsContext()); | 1844 CHECK(maybe_context->IsContext()); |
| 1855 Register context_reg = StubFailureTrampolineFrame::context_register(); | 1845 Register context_reg = StubFailureTrampolineFrame::context_register(); |
| 1856 value = reinterpret_cast<intptr_t>(maybe_context); | 1846 value = reinterpret_cast<intptr_t>(maybe_context); |
| 1857 output_frame->SetRegister(context_reg.code(), value); | 1847 output_frame->SetRegister(context_reg.code(), value); |
| 1858 output_frame->SetFrameSlot(context_frame_offset, value); | |
| 1859 DebugPrintOutputSlot(value, frame_index, context_frame_offset, "context\n"); | |
| 1860 ++value_iterator; | 1848 ++value_iterator; |
| 1861 | 1849 |
| 1862 // Copy constant stack parameters to the failure frame. If the number of stack | 1850 // Copy constant stack parameters to the failure frame. If the number of stack |
| 1863 // parameters is not known in the descriptor, the arguments object is the way | 1851 // parameters is not known in the descriptor, the arguments object is the way |
| 1864 // to access them. | 1852 // to access them. |
| 1865 for (int i = 0; i < stack_param_count; i++) { | 1853 for (int i = 0; i < stack_param_count; i++) { |
| 1866 output_frame_offset -= kPointerSize; | 1854 output_frame_offset -= kPointerSize; |
| 1867 Object** stack_parameter = reinterpret_cast<Object**>( | 1855 Object** stack_parameter = reinterpret_cast<Object**>( |
| 1868 frame_ptr + StandardFrameConstants::kCallerSPOffset + | 1856 frame_ptr + StandardFrameConstants::kCallerSPOffset + |
| 1869 (stack_param_count - i - 1) * kPointerSize); | 1857 (stack_param_count - i - 1) * kPointerSize); |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2001 output_offset; | 1989 output_offset; |
| 2002 PrintF(trace_scope_->file(), | 1990 PrintF(trace_scope_->file(), |
| 2003 " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" V8PRIxPTR " ; %s", | 1991 " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" V8PRIxPTR " ; %s", |
| 2004 reinterpret_cast<intptr_t>(output_address), output_offset, value, | 1992 reinterpret_cast<intptr_t>(output_address), output_offset, value, |
| 2005 debug_hint_string == nullptr ? "" : debug_hint_string); | 1993 debug_hint_string == nullptr ? "" : debug_hint_string); |
| 2006 } | 1994 } |
| 2007 } | 1995 } |
| 2008 | 1996 |
| 2009 | 1997 |
| 2010 unsigned Deoptimizer::ComputeInputFrameSize() const { | 1998 unsigned Deoptimizer::ComputeInputFrameSize() const { |
| 2011 unsigned fixed_size = StandardFrameConstants::kFixedFrameSize; | 1999 unsigned fixed_size = (compiled_code_->kind() == Code::OPTIMIZED_FUNCTION) |
| 2012 if (!function_->IsSmi()) { | 2000 ? ComputeJavascriptFixedSize(function_->shared()) |
| 2013 fixed_size += ComputeIncomingArgumentSize(function_->shared()); | 2001 : TypedFrameConstants::kFixedFrameSize; |
| 2014 } else { | |
| 2015 CHECK_EQ(Smi::cast(function_), Smi::FromInt(StackFrame::STUB)); | |
| 2016 } | |
| 2017 // The fp-to-sp delta already takes the context, constant pool pointer and the | 2002 // The fp-to-sp delta already takes the context, constant pool pointer and the |
| 2018 // function into account so we have to avoid double counting them. | 2003 // function into account so we have to avoid double counting them. |
| 2019 unsigned result = fixed_size + fp_to_sp_delta_ - | 2004 unsigned result = fixed_size + fp_to_sp_delta_ - |
| 2020 StandardFrameConstants::kFixedFrameSizeFromFp; | 2005 ((compiled_code_->kind() == Code::OPTIMIZED_FUNCTION) |
| 2006 ? StandardFrameConstants::kFixedFrameSizeFromFp |
| 2007 : TypedFrameConstants::kFixedFrameSizeFromFp); |
| 2021 if (compiled_code_->kind() == Code::OPTIMIZED_FUNCTION) { | 2008 if (compiled_code_->kind() == Code::OPTIMIZED_FUNCTION) { |
| 2022 unsigned stack_slots = compiled_code_->stack_slots(); | 2009 unsigned stack_slots = compiled_code_->stack_slots(); |
| 2023 unsigned outgoing_size = | 2010 unsigned outgoing_size = |
| 2024 ComputeOutgoingArgumentSize(compiled_code_, bailout_id_); | 2011 ComputeOutgoingArgumentSize(compiled_code_, bailout_id_); |
| 2025 CHECK(result == | 2012 CHECK(result == |
| 2026 fixed_size + (stack_slots * kPointerSize) - | 2013 fixed_size + (stack_slots * kPointerSize) - |
| 2027 StandardFrameConstants::kFixedFrameSize + outgoing_size); | 2014 StandardFrameConstants::kFixedFrameSize + outgoing_size); |
| 2028 } | 2015 } |
| 2029 return result; | 2016 return result; |
| 2030 } | 2017 } |
| (...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2337 int args_length) { | 2324 int args_length) { |
| 2338 buffer_->Add(ARGUMENTS_OBJECT, zone()); | 2325 buffer_->Add(ARGUMENTS_OBJECT, zone()); |
| 2339 buffer_->Add(args_known, zone()); | 2326 buffer_->Add(args_known, zone()); |
| 2340 buffer_->Add(args_index, zone()); | 2327 buffer_->Add(args_index, zone()); |
| 2341 buffer_->Add(args_length, zone()); | 2328 buffer_->Add(args_length, zone()); |
| 2342 } | 2329 } |
| 2343 | 2330 |
| 2344 | 2331 |
| 2345 void Translation::StoreJSFrameFunction() { | 2332 void Translation::StoreJSFrameFunction() { |
| 2346 StoreStackSlot((StandardFrameConstants::kCallerPCOffset - | 2333 StoreStackSlot((StandardFrameConstants::kCallerPCOffset - |
| 2347 StandardFrameConstants::kMarkerOffset) / | 2334 StandardFrameConstants::kFunctionOffset) / |
| 2348 kPointerSize); | 2335 kPointerSize); |
| 2349 } | 2336 } |
| 2350 | 2337 |
| 2351 int Translation::NumberOfOperandsFor(Opcode opcode) { | 2338 int Translation::NumberOfOperandsFor(Opcode opcode) { |
| 2352 switch (opcode) { | 2339 switch (opcode) { |
| 2353 case GETTER_STUB_FRAME: | 2340 case GETTER_STUB_FRAME: |
| 2354 case SETTER_STUB_FRAME: | 2341 case SETTER_STUB_FRAME: |
| 2355 case DUPLICATED_OBJECT: | 2342 case DUPLICATED_OBJECT: |
| 2356 case ARGUMENTS_OBJECT: | 2343 case ARGUMENTS_OBJECT: |
| 2357 case CAPTURED_OBJECT: | 2344 case CAPTURED_OBJECT: |
| (...skipping 1380 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3738 CHECK(value_info->IsMaterializedObject()); | 3725 CHECK(value_info->IsMaterializedObject()); |
| 3739 | 3726 |
| 3740 value_info->value_ = | 3727 value_info->value_ = |
| 3741 Handle<Object>(previously_materialized_objects->get(i), isolate_); | 3728 Handle<Object>(previously_materialized_objects->get(i), isolate_); |
| 3742 } | 3729 } |
| 3743 } | 3730 } |
| 3744 } | 3731 } |
| 3745 | 3732 |
| 3746 } // namespace internal | 3733 } // namespace internal |
| 3747 } // namespace v8 | 3734 } // namespace v8 |
| OLD | NEW |