Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(16)

Side by Side Diff: src/ppc/code-stubs-ppc.cc

Issue 1966263002: PPC: [Interpreter] Fix incorrect frame walking in arguments create stubs (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 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 #if V8_TARGET_ARCH_PPC 5 #if V8_TARGET_ARCH_PPC
6 6
7 #include "src/code-stubs.h" 7 #include "src/code-stubs.h"
8 #include "src/api-arguments.h" 8 #include "src/api-arguments.h"
9 #include "src/base/bits.h" 9 #include "src/base/bits.h"
10 #include "src/bootstrapper.h" 10 #include "src/bootstrapper.h"
(...skipping 4760 matching lines...) Expand 10 before | Expand all | Expand 10 after
4771 4771
4772 void FastNewRestParameterStub::Generate(MacroAssembler* masm) { 4772 void FastNewRestParameterStub::Generate(MacroAssembler* masm) {
4773 // ----------- S t a t e ------------- 4773 // ----------- S t a t e -------------
4774 // -- r4 : function 4774 // -- r4 : function
4775 // -- cp : context 4775 // -- cp : context
4776 // -- fp : frame pointer 4776 // -- fp : frame pointer
4777 // -- lr : return address 4777 // -- lr : return address
4778 // ----------------------------------- 4778 // -----------------------------------
4779 __ AssertFunction(r4); 4779 __ AssertFunction(r4);
4780 4780
4781 // For Ignition we need to skip all possible handler/stub frames until 4781 // Make r5 point to the JavaScript frame.
4782 // we reach the JavaScript frame for the function (similar to what the 4782 __ mr(r5, fp);
4783 // runtime fallback implementation does). So make r5 point to that 4783 if (skip_stub_frame()) {
4784 // JavaScript frame. 4784 // For Ignition we need to skip the handler/stub frame to reach the
4785 { 4785 // JavaScript frame for the function.
4786 Label loop, loop_entry;
4787 __ mr(r5, fp);
4788 __ b(&loop_entry);
4789 __ bind(&loop);
4790 __ LoadP(r5, MemOperand(r5, StandardFrameConstants::kCallerFPOffset)); 4786 __ LoadP(r5, MemOperand(r5, StandardFrameConstants::kCallerFPOffset));
4791 __ bind(&loop_entry); 4787 }
4788 if (FLAG_debug_code) {
4789 Label ok;
4792 __ LoadP(ip, MemOperand(r5, StandardFrameConstants::kFunctionOffset)); 4790 __ LoadP(ip, MemOperand(r5, StandardFrameConstants::kFunctionOffset));
4793 __ cmp(ip, r4); 4791 __ cmp(ip, r4);
4794 __ bne(&loop); 4792 __ beq(&ok);
4793 __ Abort(kInvalidFrameForFastNewRestArgumentsStub);
4794 __ bind(&ok);
4795 } 4795 }
4796 4796
4797 // Check if we have rest parameters (only possible if we have an 4797 // Check if we have rest parameters (only possible if we have an
4798 // arguments adaptor frame below the function frame). 4798 // arguments adaptor frame below the function frame).
4799 Label no_rest_parameters; 4799 Label no_rest_parameters;
4800 __ LoadP(r5, MemOperand(r5, StandardFrameConstants::kCallerFPOffset)); 4800 __ LoadP(r5, MemOperand(r5, StandardFrameConstants::kCallerFPOffset));
4801 __ LoadP(ip, MemOperand(r5, CommonFrameConstants::kContextOrFrameTypeOffset)); 4801 __ LoadP(ip, MemOperand(r5, CommonFrameConstants::kContextOrFrameTypeOffset));
4802 __ CmpSmiLiteral(ip, Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR), r0); 4802 __ CmpSmiLiteral(ip, Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR), r0);
4803 __ bne(&no_rest_parameters); 4803 __ bne(&no_rest_parameters);
4804 4804
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
4915 4915
4916 void FastNewSloppyArgumentsStub::Generate(MacroAssembler* masm) { 4916 void FastNewSloppyArgumentsStub::Generate(MacroAssembler* masm) {
4917 // ----------- S t a t e ------------- 4917 // ----------- S t a t e -------------
4918 // -- r4 : function 4918 // -- r4 : function
4919 // -- cp : context 4919 // -- cp : context
4920 // -- fp : frame pointer 4920 // -- fp : frame pointer
4921 // -- lr : return address 4921 // -- lr : return address
4922 // ----------------------------------- 4922 // -----------------------------------
4923 __ AssertFunction(r4); 4923 __ AssertFunction(r4);
4924 4924
4925 // For Ignition we need to skip all possible handler/stub frames until 4925 // Make r10 point to the JavaScript frame.
4926 // we reach the JavaScript frame for the function (similar to what the 4926 __ mr(r10, fp);
4927 // runtime fallback implementation does). So make r10 point to that 4927 if (skip_stub_frame()) {
4928 // JavaScript frame. 4928 // For Ignition we need to skip the handler/stub frame to reach the
4929 { 4929 // JavaScript frame for the function.
4930 Label loop, loop_entry;
4931 __ mr(r10, fp);
4932 __ b(&loop_entry);
4933 __ bind(&loop);
4934 __ LoadP(r10, MemOperand(r10, StandardFrameConstants::kCallerFPOffset)); 4930 __ LoadP(r10, MemOperand(r10, StandardFrameConstants::kCallerFPOffset));
4935 __ bind(&loop_entry); 4931 }
4932 if (FLAG_debug_code) {
4933 Label ok;
4936 __ LoadP(ip, MemOperand(r10, StandardFrameConstants::kFunctionOffset)); 4934 __ LoadP(ip, MemOperand(r10, StandardFrameConstants::kFunctionOffset));
4937 __ cmp(ip, r4); 4935 __ cmp(ip, r4);
4938 __ bne(&loop); 4936 __ beq(&ok);
4937 __ Abort(kInvalidFrameForFastNewRestArgumentsStub);
4938 __ bind(&ok);
4939 } 4939 }
4940 4940
4941 4941
4942 // TODO(bmeurer): Cleanup to match the FastNewStrictArgumentsStub. 4942 // TODO(bmeurer): Cleanup to match the FastNewStrictArgumentsStub.
4943 __ LoadP(r5, FieldMemOperand(r4, JSFunction::kSharedFunctionInfoOffset)); 4943 __ LoadP(r5, FieldMemOperand(r4, JSFunction::kSharedFunctionInfoOffset));
4944 __ LoadWordArith( 4944 __ LoadWordArith(
4945 r5, FieldMemOperand(r5, SharedFunctionInfo::kFormalParameterCountOffset)); 4945 r5, FieldMemOperand(r5, SharedFunctionInfo::kFormalParameterCountOffset));
4946 #if V8_TARGET_ARCH_PPC64 4946 #if V8_TARGET_ARCH_PPC64
4947 __ SmiTag(r5); 4947 __ SmiTag(r5);
4948 #endif 4948 #endif
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after
5185 5185
5186 void FastNewStrictArgumentsStub::Generate(MacroAssembler* masm) { 5186 void FastNewStrictArgumentsStub::Generate(MacroAssembler* masm) {
5187 // ----------- S t a t e ------------- 5187 // ----------- S t a t e -------------
5188 // -- r4 : function 5188 // -- r4 : function
5189 // -- cp : context 5189 // -- cp : context
5190 // -- fp : frame pointer 5190 // -- fp : frame pointer
5191 // -- lr : return address 5191 // -- lr : return address
5192 // ----------------------------------- 5192 // -----------------------------------
5193 __ AssertFunction(r4); 5193 __ AssertFunction(r4);
5194 5194
5195 // For Ignition we need to skip all possible handler/stub frames until 5195 // Make r5 point to the JavaScript frame.
5196 // we reach the JavaScript frame for the function (similar to what the 5196 __ mr(r5, fp);
5197 // runtime fallback implementation does). So make r5 point to that 5197 if (skip_stub_frame()) {
5198 // JavaScript frame. 5198 // For Ignition we need to skip the handler/stub frame to reach the
5199 { 5199 // JavaScript frame for the function.
5200 Label loop, loop_entry;
5201 __ mr(r5, fp);
5202 __ b(&loop_entry);
5203 __ bind(&loop);
5204 __ LoadP(r5, MemOperand(r5, StandardFrameConstants::kCallerFPOffset)); 5200 __ LoadP(r5, MemOperand(r5, StandardFrameConstants::kCallerFPOffset));
5205 __ bind(&loop_entry); 5201 }
5202 if (FLAG_debug_code) {
5203 Label ok;
5206 __ LoadP(ip, MemOperand(r5, StandardFrameConstants::kFunctionOffset)); 5204 __ LoadP(ip, MemOperand(r5, StandardFrameConstants::kFunctionOffset));
5207 __ cmp(ip, r4); 5205 __ cmp(ip, r4);
5208 __ bne(&loop); 5206 __ b(&ok);
5207 __ Abort(kInvalidFrameForFastNewRestArgumentsStub);
5208 __ bind(&ok);
5209 } 5209 }
5210 5210
5211 // Check if we have an arguments adaptor frame below the function frame. 5211 // Check if we have an arguments adaptor frame below the function frame.
5212 Label arguments_adaptor, arguments_done; 5212 Label arguments_adaptor, arguments_done;
5213 __ LoadP(r6, MemOperand(r5, StandardFrameConstants::kCallerFPOffset)); 5213 __ LoadP(r6, MemOperand(r5, StandardFrameConstants::kCallerFPOffset));
5214 __ LoadP(ip, MemOperand(r6, CommonFrameConstants::kContextOrFrameTypeOffset)); 5214 __ LoadP(ip, MemOperand(r6, CommonFrameConstants::kContextOrFrameTypeOffset));
5215 __ CmpSmiLiteral(ip, Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR), r0); 5215 __ CmpSmiLiteral(ip, Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR), r0);
5216 __ beq(&arguments_adaptor); 5216 __ beq(&arguments_adaptor);
5217 { 5217 {
5218 __ LoadP(r4, FieldMemOperand(r4, JSFunction::kSharedFunctionInfoOffset)); 5218 __ LoadP(r4, FieldMemOperand(r4, JSFunction::kSharedFunctionInfoOffset));
(...skipping 584 matching lines...) Expand 10 before | Expand all | Expand 10 after
5803 fp, (PropertyCallbackArguments::kReturnValueOffset + 3) * kPointerSize); 5803 fp, (PropertyCallbackArguments::kReturnValueOffset + 3) * kPointerSize);
5804 CallApiFunctionAndReturn(masm, api_function_address, thunk_ref, 5804 CallApiFunctionAndReturn(masm, api_function_address, thunk_ref,
5805 kStackUnwindSpace, NULL, return_value_operand, NULL); 5805 kStackUnwindSpace, NULL, return_value_operand, NULL);
5806 } 5806 }
5807 5807
5808 #undef __ 5808 #undef __
5809 } // namespace internal 5809 } // namespace internal
5810 } // namespace v8 5810 } // namespace v8
5811 5811
5812 #endif // V8_TARGET_ARCH_PPC 5812 #endif // V8_TARGET_ARCH_PPC
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698