| 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 625 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 636 PrintF(" 0x%08x: [top + %d] <- 0x%08x ; caller's pc\n", | 636 PrintF(" 0x%08x: [top + %d] <- 0x%08x ; caller's pc\n", |
| 637 top_address + output_offset, output_offset, callers_pc); | 637 top_address + output_offset, output_offset, callers_pc); |
| 638 } | 638 } |
| 639 | 639 |
| 640 // Read caller's FP from the previous frame, and set this frame's FP. | 640 // Read caller's FP from the previous frame, and set this frame's FP. |
| 641 output_offset -= kPointerSize; | 641 output_offset -= kPointerSize; |
| 642 intptr_t value = output_[frame_index - 1]->GetFp(); | 642 intptr_t value = output_[frame_index - 1]->GetFp(); |
| 643 output_frame->SetFrameSlot(output_offset, value); | 643 output_frame->SetFrameSlot(output_offset, value); |
| 644 intptr_t fp_value = top_address + output_offset; | 644 intptr_t fp_value = top_address + output_offset; |
| 645 output_frame->SetFp(fp_value); | 645 output_frame->SetFp(fp_value); |
| 646 if (FLAG_trace_deopt) { | 646 if (trace_) { |
| 647 PrintF(" 0x%08x: [top + %d] <- 0x%08x ; caller's fp\n", | 647 PrintF(" 0x%08x: [top + %d] <- 0x%08x ; caller's fp\n", |
| 648 fp_value, output_offset, value); | 648 fp_value, output_offset, value); |
| 649 } | 649 } |
| 650 | 650 |
| 651 // The context can be gotten from the previous frame. | 651 // The context can be gotten from the previous frame. |
| 652 output_offset -= kPointerSize; | 652 output_offset -= kPointerSize; |
| 653 value = output_[frame_index - 1]->GetContext(); | 653 value = output_[frame_index - 1]->GetContext(); |
| 654 output_frame->SetFrameSlot(output_offset, value); | 654 output_frame->SetFrameSlot(output_offset, value); |
| 655 if (FLAG_trace_deopt) { | 655 if (trace_) { |
| 656 PrintF(" 0x%08x: [top + %d] <- 0x%08x ; context\n", | 656 PrintF(" 0x%08x: [top + %d] <- 0x%08x ; context\n", |
| 657 top_address + output_offset, output_offset, value); | 657 top_address + output_offset, output_offset, value); |
| 658 } | 658 } |
| 659 | 659 |
| 660 // A marker value is used in place of the function. | 660 // A marker value is used in place of the function. |
| 661 output_offset -= kPointerSize; | 661 output_offset -= kPointerSize; |
| 662 value = reinterpret_cast<intptr_t>(Smi::FromInt(StackFrame::CONSTRUCT)); | 662 value = reinterpret_cast<intptr_t>(Smi::FromInt(StackFrame::CONSTRUCT)); |
| 663 output_frame->SetFrameSlot(output_offset, value); | 663 output_frame->SetFrameSlot(output_offset, value); |
| 664 if (FLAG_trace_deopt) { | 664 if (trace_) { |
| 665 PrintF(" 0x%08x: [top + %d] <- 0x%08x ; function (construct sentinel)\n", | 665 PrintF(" 0x%08x: [top + %d] <- 0x%08x ; function (construct sentinel)\n", |
| 666 top_address + output_offset, output_offset, value); | 666 top_address + output_offset, output_offset, value); |
| 667 } | 667 } |
| 668 | 668 |
| 669 // The output frame reflects a JSConstructStubGeneric frame. | 669 // The output frame reflects a JSConstructStubGeneric frame. |
| 670 output_offset -= kPointerSize; | 670 output_offset -= kPointerSize; |
| 671 value = reinterpret_cast<intptr_t>(construct_stub); | 671 value = reinterpret_cast<intptr_t>(construct_stub); |
| 672 output_frame->SetFrameSlot(output_offset, value); | 672 output_frame->SetFrameSlot(output_offset, value); |
| 673 if (FLAG_trace_deopt) { | 673 if (trace_) { |
| 674 PrintF(" 0x%08x: [top + %d] <- 0x%08x ; code object\n", | 674 PrintF(" 0x%08x: [top + %d] <- 0x%08x ; code object\n", |
| 675 top_address + output_offset, output_offset, value); | 675 top_address + output_offset, output_offset, value); |
| 676 } | 676 } |
| 677 | 677 |
| 678 // Number of incoming arguments. | 678 // Number of incoming arguments. |
| 679 output_offset -= kPointerSize; | 679 output_offset -= kPointerSize; |
| 680 value = reinterpret_cast<uint32_t>(Smi::FromInt(height - 1)); | 680 value = reinterpret_cast<uint32_t>(Smi::FromInt(height - 1)); |
| 681 output_frame->SetFrameSlot(output_offset, value); | 681 output_frame->SetFrameSlot(output_offset, value); |
| 682 if (FLAG_trace_deopt) { | 682 if (trace_) { |
| 683 PrintF(" 0x%08x: [top + %d] <- 0x%08x ; argc (%d)\n", | 683 PrintF(" 0x%08x: [top + %d] <- 0x%08x ; argc (%d)\n", |
| 684 top_address + output_offset, output_offset, value, height - 1); | 684 top_address + output_offset, output_offset, value, height - 1); |
| 685 } | 685 } |
| 686 | 686 |
| 687 // Constructor function being invoked by the stub. | 687 // Constructor function being invoked by the stub. |
| 688 output_offset -= kPointerSize; | 688 output_offset -= kPointerSize; |
| 689 value = reinterpret_cast<intptr_t>(function); | 689 value = reinterpret_cast<intptr_t>(function); |
| 690 output_frame->SetFrameSlot(output_offset, value); | 690 output_frame->SetFrameSlot(output_offset, value); |
| 691 if (FLAG_trace_deopt) { | 691 if (trace_) { |
| 692 PrintF(" 0x%08x: [top + %d] <- 0x%08x ; constructor function\n", | 692 PrintF(" 0x%08x: [top + %d] <- 0x%08x ; constructor function\n", |
| 693 top_address + output_offset, output_offset, value); | 693 top_address + output_offset, output_offset, value); |
| 694 } | 694 } |
| 695 | 695 |
| 696 // The newly allocated object was passed as receiver in the artificial | 696 // The newly allocated object was passed as receiver in the artificial |
| 697 // constructor stub environment created by HEnvironment::CopyForInlining(). | 697 // constructor stub environment created by HEnvironment::CopyForInlining(). |
| 698 output_offset -= kPointerSize; | 698 output_offset -= kPointerSize; |
| 699 value = output_frame->GetFrameSlot(output_frame_size - kPointerSize); | 699 value = output_frame->GetFrameSlot(output_frame_size - kPointerSize); |
| 700 output_frame->SetFrameSlot(output_offset, value); | 700 output_frame->SetFrameSlot(output_offset, value); |
| 701 if (FLAG_trace_deopt) { | 701 if (trace_) { |
| 702 PrintF(" 0x%08x: [top + %d] <- 0x%08x ; allocated receiver\n", | 702 PrintF(" 0x%08x: [top + %d] <- 0x%08x ; allocated receiver\n", |
| 703 top_address + output_offset, output_offset, value); | 703 top_address + output_offset, output_offset, value); |
| 704 } | 704 } |
| 705 | 705 |
| 706 ASSERT(0 == output_offset); | 706 ASSERT(0 == output_offset); |
| 707 | 707 |
| 708 uint32_t pc = reinterpret_cast<uint32_t>( | 708 uint32_t pc = reinterpret_cast<uint32_t>( |
| 709 construct_stub->instruction_start() + | 709 construct_stub->instruction_start() + |
| 710 isolate_->heap()->construct_stub_deopt_pc_offset()->value()); | 710 isolate_->heap()->construct_stub_deopt_pc_offset()->value()); |
| 711 output_frame->SetPc(pc); | 711 output_frame->SetPc(pc); |
| 712 } | 712 } |
| 713 | 713 |
| 714 | 714 |
| 715 void Deoptimizer::DoComputeAccessorStubFrame(TranslationIterator* iterator, | 715 void Deoptimizer::DoComputeAccessorStubFrame(TranslationIterator* iterator, |
| 716 int frame_index, | 716 int frame_index, |
| 717 bool is_setter_stub_frame) { | 717 bool is_setter_stub_frame) { |
| 718 JSFunction* accessor = JSFunction::cast(ComputeLiteral(iterator->Next())); | 718 JSFunction* accessor = JSFunction::cast(ComputeLiteral(iterator->Next())); |
| 719 // The receiver (and the implicit return value, if any) are expected in | 719 // The receiver (and the implicit return value, if any) are expected in |
| 720 // registers by the LoadIC/StoreIC, so they don't belong to the output stack | 720 // registers by the LoadIC/StoreIC, so they don't belong to the output stack |
| 721 // frame. This means that we have to use a height of 0. | 721 // frame. This means that we have to use a height of 0. |
| 722 unsigned height = 0; | 722 unsigned height = 0; |
| 723 unsigned height_in_bytes = height * kPointerSize; | 723 unsigned height_in_bytes = height * kPointerSize; |
| 724 const char* kind = is_setter_stub_frame ? "setter" : "getter"; | 724 const char* kind = is_setter_stub_frame ? "setter" : "getter"; |
| 725 if (FLAG_trace_deopt) { | 725 if (trace_) { |
| 726 PrintF(" translating %s stub => height=%u\n", kind, height_in_bytes); | 726 PrintF(" translating %s stub => height=%u\n", kind, height_in_bytes); |
| 727 } | 727 } |
| 728 | 728 |
| 729 // We need 5 stack entries from StackFrame::INTERNAL (lr, fp, cp, frame type, | 729 // We need 5 stack entries from StackFrame::INTERNAL (lr, fp, cp, frame type, |
| 730 // code object, see MacroAssembler::EnterFrame). For a setter stub frames we | 730 // code object, see MacroAssembler::EnterFrame). For a setter stub frames we |
| 731 // need one additional entry for the implicit return value, see | 731 // need one additional entry for the implicit return value, see |
| 732 // StoreStubCompiler::CompileStoreViaSetter. | 732 // StoreStubCompiler::CompileStoreViaSetter. |
| 733 unsigned fixed_frame_entries = 5 + (is_setter_stub_frame ? 1 : 0); | 733 unsigned fixed_frame_entries = 5 + (is_setter_stub_frame ? 1 : 0); |
| 734 unsigned fixed_frame_size = fixed_frame_entries * kPointerSize; | 734 unsigned fixed_frame_size = fixed_frame_entries * kPointerSize; |
| 735 unsigned output_frame_size = height_in_bytes + fixed_frame_size; | 735 unsigned output_frame_size = height_in_bytes + fixed_frame_size; |
| (...skipping 12 matching lines...) Expand all Loading... |
| 748 // this frame's size. | 748 // this frame's size. |
| 749 uint32_t top_address = output_[frame_index - 1]->GetTop() - output_frame_size; | 749 uint32_t top_address = output_[frame_index - 1]->GetTop() - output_frame_size; |
| 750 output_frame->SetTop(top_address); | 750 output_frame->SetTop(top_address); |
| 751 | 751 |
| 752 unsigned output_offset = output_frame_size; | 752 unsigned output_offset = output_frame_size; |
| 753 | 753 |
| 754 // Read caller's PC from the previous frame. | 754 // Read caller's PC from the previous frame. |
| 755 output_offset -= kPointerSize; | 755 output_offset -= kPointerSize; |
| 756 intptr_t callers_pc = output_[frame_index - 1]->GetPc(); | 756 intptr_t callers_pc = output_[frame_index - 1]->GetPc(); |
| 757 output_frame->SetFrameSlot(output_offset, callers_pc); | 757 output_frame->SetFrameSlot(output_offset, callers_pc); |
| 758 if (FLAG_trace_deopt) { | 758 if (trace_) { |
| 759 PrintF(" 0x%08" V8PRIxPTR ": [top + %u] <- 0x%08" V8PRIxPTR | 759 PrintF(" 0x%08" V8PRIxPTR ": [top + %u] <- 0x%08" V8PRIxPTR |
| 760 " ; caller's pc\n", | 760 " ; caller's pc\n", |
| 761 top_address + output_offset, output_offset, callers_pc); | 761 top_address + output_offset, output_offset, callers_pc); |
| 762 } | 762 } |
| 763 | 763 |
| 764 // Read caller's FP from the previous frame, and set this frame's FP. | 764 // Read caller's FP from the previous frame, and set this frame's FP. |
| 765 output_offset -= kPointerSize; | 765 output_offset -= kPointerSize; |
| 766 intptr_t value = output_[frame_index - 1]->GetFp(); | 766 intptr_t value = output_[frame_index - 1]->GetFp(); |
| 767 output_frame->SetFrameSlot(output_offset, value); | 767 output_frame->SetFrameSlot(output_offset, value); |
| 768 intptr_t fp_value = top_address + output_offset; | 768 intptr_t fp_value = top_address + output_offset; |
| 769 output_frame->SetFp(fp_value); | 769 output_frame->SetFp(fp_value); |
| 770 if (FLAG_trace_deopt) { | 770 if (trace_) { |
| 771 PrintF(" 0x%08" V8PRIxPTR ": [top + %u] <- 0x%08" V8PRIxPTR | 771 PrintF(" 0x%08" V8PRIxPTR ": [top + %u] <- 0x%08" V8PRIxPTR |
| 772 " ; caller's fp\n", | 772 " ; caller's fp\n", |
| 773 fp_value, output_offset, value); | 773 fp_value, output_offset, value); |
| 774 } | 774 } |
| 775 | 775 |
| 776 // The context can be gotten from the previous frame. | 776 // The context can be gotten from the previous frame. |
| 777 output_offset -= kPointerSize; | 777 output_offset -= kPointerSize; |
| 778 value = output_[frame_index - 1]->GetContext(); | 778 value = output_[frame_index - 1]->GetContext(); |
| 779 output_frame->SetFrameSlot(output_offset, value); | 779 output_frame->SetFrameSlot(output_offset, value); |
| 780 if (FLAG_trace_deopt) { | 780 if (trace_) { |
| 781 PrintF(" 0x%08" V8PRIxPTR ": [top + %u] <- 0x%08" V8PRIxPTR | 781 PrintF(" 0x%08" V8PRIxPTR ": [top + %u] <- 0x%08" V8PRIxPTR |
| 782 " ; context\n", | 782 " ; context\n", |
| 783 top_address + output_offset, output_offset, value); | 783 top_address + output_offset, output_offset, value); |
| 784 } | 784 } |
| 785 | 785 |
| 786 // A marker value is used in place of the function. | 786 // A marker value is used in place of the function. |
| 787 output_offset -= kPointerSize; | 787 output_offset -= kPointerSize; |
| 788 value = reinterpret_cast<intptr_t>(Smi::FromInt(StackFrame::INTERNAL)); | 788 value = reinterpret_cast<intptr_t>(Smi::FromInt(StackFrame::INTERNAL)); |
| 789 output_frame->SetFrameSlot(output_offset, value); | 789 output_frame->SetFrameSlot(output_offset, value); |
| 790 if (FLAG_trace_deopt) { | 790 if (trace_) { |
| 791 PrintF(" 0x%08" V8PRIxPTR ": [top + %u] <- 0x%08" V8PRIxPTR | 791 PrintF(" 0x%08" V8PRIxPTR ": [top + %u] <- 0x%08" V8PRIxPTR |
| 792 " ; function (%s sentinel)\n", | 792 " ; function (%s sentinel)\n", |
| 793 top_address + output_offset, output_offset, value, kind); | 793 top_address + output_offset, output_offset, value, kind); |
| 794 } | 794 } |
| 795 | 795 |
| 796 // Get Code object from accessor stub. | 796 // Get Code object from accessor stub. |
| 797 output_offset -= kPointerSize; | 797 output_offset -= kPointerSize; |
| 798 Builtins::Name name = is_setter_stub_frame ? | 798 Builtins::Name name = is_setter_stub_frame ? |
| 799 Builtins::kStoreIC_Setter_ForDeopt : | 799 Builtins::kStoreIC_Setter_ForDeopt : |
| 800 Builtins::kLoadIC_Getter_ForDeopt; | 800 Builtins::kLoadIC_Getter_ForDeopt; |
| 801 Code* accessor_stub = isolate_->builtins()->builtin(name); | 801 Code* accessor_stub = isolate_->builtins()->builtin(name); |
| 802 value = reinterpret_cast<intptr_t>(accessor_stub); | 802 value = reinterpret_cast<intptr_t>(accessor_stub); |
| 803 output_frame->SetFrameSlot(output_offset, value); | 803 output_frame->SetFrameSlot(output_offset, value); |
| 804 if (FLAG_trace_deopt) { | 804 if (trace_) { |
| 805 PrintF(" 0x%08" V8PRIxPTR ": [top + %u] <- 0x%08" V8PRIxPTR | 805 PrintF(" 0x%08" V8PRIxPTR ": [top + %u] <- 0x%08" V8PRIxPTR |
| 806 " ; code object\n", | 806 " ; code object\n", |
| 807 top_address + output_offset, output_offset, value); | 807 top_address + output_offset, output_offset, value); |
| 808 } | 808 } |
| 809 | 809 |
| 810 // Skip receiver. | 810 // Skip receiver. |
| 811 Translation::Opcode opcode = | 811 Translation::Opcode opcode = |
| 812 static_cast<Translation::Opcode>(iterator->Next()); | 812 static_cast<Translation::Opcode>(iterator->Next()); |
| 813 iterator->Skip(Translation::NumberOfOperandsFor(opcode)); | 813 iterator->Skip(Translation::NumberOfOperandsFor(opcode)); |
| 814 | 814 |
| (...skipping 25 matching lines...) Expand all Loading... |
| 840 if (frame_index != 0) { | 840 if (frame_index != 0) { |
| 841 function = JSFunction::cast(ComputeLiteral(iterator->Next())); | 841 function = JSFunction::cast(ComputeLiteral(iterator->Next())); |
| 842 } else { | 842 } else { |
| 843 int closure_id = iterator->Next(); | 843 int closure_id = iterator->Next(); |
| 844 USE(closure_id); | 844 USE(closure_id); |
| 845 ASSERT_EQ(Translation::kSelfLiteralId, closure_id); | 845 ASSERT_EQ(Translation::kSelfLiteralId, closure_id); |
| 846 function = function_; | 846 function = function_; |
| 847 } | 847 } |
| 848 unsigned height = iterator->Next(); | 848 unsigned height = iterator->Next(); |
| 849 unsigned height_in_bytes = height * kPointerSize; | 849 unsigned height_in_bytes = height * kPointerSize; |
| 850 if (FLAG_trace_deopt) { | 850 if (trace_) { |
| 851 PrintF(" translating "); | 851 PrintF(" translating "); |
| 852 function->PrintName(); | 852 function->PrintName(); |
| 853 PrintF(" => node=%d, height=%d\n", node_id.ToInt(), height_in_bytes); | 853 PrintF(" => node=%d, height=%d\n", node_id.ToInt(), height_in_bytes); |
| 854 } | 854 } |
| 855 | 855 |
| 856 // The 'fixed' part of the frame consists of the incoming parameters and | 856 // The 'fixed' part of the frame consists of the incoming parameters and |
| 857 // the part described by JavaScriptFrameConstants. | 857 // the part described by JavaScriptFrameConstants. |
| 858 unsigned fixed_frame_size = ComputeFixedSize(function); | 858 unsigned fixed_frame_size = ComputeFixedSize(function); |
| 859 unsigned input_frame_size = input_->GetFrameSize(); | 859 unsigned input_frame_size = input_->GetFrameSize(); |
| 860 unsigned output_frame_size = height_in_bytes + fixed_frame_size; | 860 unsigned output_frame_size = height_in_bytes + fixed_frame_size; |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 904 // function code and AST id of the bailout. | 904 // function code and AST id of the bailout. |
| 905 output_offset -= kPointerSize; | 905 output_offset -= kPointerSize; |
| 906 input_offset -= kPointerSize; | 906 input_offset -= kPointerSize; |
| 907 intptr_t value; | 907 intptr_t value; |
| 908 if (is_bottommost) { | 908 if (is_bottommost) { |
| 909 value = input_->GetFrameSlot(input_offset); | 909 value = input_->GetFrameSlot(input_offset); |
| 910 } else { | 910 } else { |
| 911 value = output_[frame_index - 1]->GetPc(); | 911 value = output_[frame_index - 1]->GetPc(); |
| 912 } | 912 } |
| 913 output_frame->SetFrameSlot(output_offset, value); | 913 output_frame->SetFrameSlot(output_offset, value); |
| 914 if (FLAG_trace_deopt) { | 914 if (trace_) { |
| 915 PrintF(" 0x%08x: [top + %d] <- 0x%08x ; caller's pc\n", | 915 PrintF(" 0x%08x: [top + %d] <- 0x%08x ; caller's pc\n", |
| 916 top_address + output_offset, output_offset, value); | 916 top_address + output_offset, output_offset, value); |
| 917 } | 917 } |
| 918 | 918 |
| 919 // The caller's frame pointer for the bottommost output frame is the same | 919 // The caller's frame pointer for the bottommost output frame is the same |
| 920 // as in the input frame. For all subsequent output frames, it can be | 920 // as in the input frame. For all subsequent output frames, it can be |
| 921 // read from the previous one. Also compute and set this frame's frame | 921 // read from the previous one. Also compute and set this frame's frame |
| 922 // pointer. | 922 // pointer. |
| 923 output_offset -= kPointerSize; | 923 output_offset -= kPointerSize; |
| 924 input_offset -= kPointerSize; | 924 input_offset -= kPointerSize; |
| 925 if (is_bottommost) { | 925 if (is_bottommost) { |
| 926 value = input_->GetFrameSlot(input_offset); | 926 value = input_->GetFrameSlot(input_offset); |
| 927 } else { | 927 } else { |
| 928 value = output_[frame_index - 1]->GetFp(); | 928 value = output_[frame_index - 1]->GetFp(); |
| 929 } | 929 } |
| 930 output_frame->SetFrameSlot(output_offset, value); | 930 output_frame->SetFrameSlot(output_offset, value); |
| 931 intptr_t fp_value = top_address + output_offset; | 931 intptr_t fp_value = top_address + output_offset; |
| 932 ASSERT(!is_bottommost || input_->GetRegister(fp.code()) == fp_value); | 932 ASSERT(!is_bottommost || input_->GetRegister(fp.code()) == fp_value); |
| 933 output_frame->SetFp(fp_value); | 933 output_frame->SetFp(fp_value); |
| 934 if (is_topmost) { | 934 if (is_topmost) { |
| 935 output_frame->SetRegister(fp.code(), fp_value); | 935 output_frame->SetRegister(fp.code(), fp_value); |
| 936 } | 936 } |
| 937 if (FLAG_trace_deopt) { | 937 if (trace_) { |
| 938 PrintF(" 0x%08x: [top + %d] <- 0x%08x ; caller's fp\n", | 938 PrintF(" 0x%08x: [top + %d] <- 0x%08x ; caller's fp\n", |
| 939 fp_value, output_offset, value); | 939 fp_value, output_offset, value); |
| 940 } | 940 } |
| 941 | 941 |
| 942 // For the bottommost output frame the context can be gotten from the input | 942 // For the bottommost output frame the context can be gotten from the input |
| 943 // frame. For all subsequent output frames it can be gotten from the function | 943 // frame. For all subsequent output frames it can be gotten from the function |
| 944 // so long as we don't inline functions that need local contexts. | 944 // so long as we don't inline functions that need local contexts. |
| 945 output_offset -= kPointerSize; | 945 output_offset -= kPointerSize; |
| 946 input_offset -= kPointerSize; | 946 input_offset -= kPointerSize; |
| 947 if (is_bottommost) { | 947 if (is_bottommost) { |
| 948 value = input_->GetFrameSlot(input_offset); | 948 value = input_->GetFrameSlot(input_offset); |
| 949 } else { | 949 } else { |
| 950 value = reinterpret_cast<intptr_t>(function->context()); | 950 value = reinterpret_cast<intptr_t>(function->context()); |
| 951 } | 951 } |
| 952 output_frame->SetFrameSlot(output_offset, value); | 952 output_frame->SetFrameSlot(output_offset, value); |
| 953 output_frame->SetContext(value); | 953 output_frame->SetContext(value); |
| 954 if (is_topmost) output_frame->SetRegister(cp.code(), value); | 954 if (is_topmost) output_frame->SetRegister(cp.code(), value); |
| 955 if (FLAG_trace_deopt) { | 955 if (trace_) { |
| 956 PrintF(" 0x%08x: [top + %d] <- 0x%08x ; context\n", | 956 PrintF(" 0x%08x: [top + %d] <- 0x%08x ; context\n", |
| 957 top_address + output_offset, output_offset, value); | 957 top_address + output_offset, output_offset, value); |
| 958 } | 958 } |
| 959 | 959 |
| 960 // The function was mentioned explicitly in the BEGIN_FRAME. | 960 // The function was mentioned explicitly in the BEGIN_FRAME. |
| 961 output_offset -= kPointerSize; | 961 output_offset -= kPointerSize; |
| 962 input_offset -= kPointerSize; | 962 input_offset -= kPointerSize; |
| 963 value = reinterpret_cast<uint32_t>(function); | 963 value = reinterpret_cast<uint32_t>(function); |
| 964 // The function for the bottommost output frame should also agree with the | 964 // The function for the bottommost output frame should also agree with the |
| 965 // input frame. | 965 // input frame. |
| 966 ASSERT(!is_bottommost || input_->GetFrameSlot(input_offset) == value); | 966 ASSERT(!is_bottommost || input_->GetFrameSlot(input_offset) == value); |
| 967 output_frame->SetFrameSlot(output_offset, value); | 967 output_frame->SetFrameSlot(output_offset, value); |
| 968 if (FLAG_trace_deopt) { | 968 if (trace_) { |
| 969 PrintF(" 0x%08x: [top + %d] <- 0x%08x ; function\n", | 969 PrintF(" 0x%08x: [top + %d] <- 0x%08x ; function\n", |
| 970 top_address + output_offset, output_offset, value); | 970 top_address + output_offset, output_offset, value); |
| 971 } | 971 } |
| 972 | 972 |
| 973 // Translate the rest of the frame. | 973 // Translate the rest of the frame. |
| 974 for (unsigned i = 0; i < height; ++i) { | 974 for (unsigned i = 0; i < height; ++i) { |
| 975 output_offset -= kPointerSize; | 975 output_offset -= kPointerSize; |
| 976 DoTranslateCommand(iterator, frame_index, output_offset); | 976 DoTranslateCommand(iterator, frame_index, output_offset); |
| 977 } | 977 } |
| 978 ASSERT(0 == output_offset); | 978 ASSERT(0 == output_offset); |
| (...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1268 __ push(ip); | 1268 __ push(ip); |
| 1269 __ b(&done); | 1269 __ b(&done); |
| 1270 ASSERT(masm()->pc_offset() - start == table_entry_size_); | 1270 ASSERT(masm()->pc_offset() - start == table_entry_size_); |
| 1271 } | 1271 } |
| 1272 __ bind(&done); | 1272 __ bind(&done); |
| 1273 } | 1273 } |
| 1274 | 1274 |
| 1275 #undef __ | 1275 #undef __ |
| 1276 | 1276 |
| 1277 } } // namespace v8::internal | 1277 } } // namespace v8::internal |
| OLD | NEW |