From 03644ab8dfadaaf4a9ad4f816805b8d367f94a43 Mon Sep 17 00:00:00 2001 From: "palfia@homejinni.com" Date: Tue, 27 Aug 2013 23:02:35 +0000 Subject: [PATCH] MIPS: cleanup api callbacks now that handles are never returned directly Port r16360 (72401868) BUG= Review URL: https://codereview.chromium.org/23604004 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@16373 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/mips/macro-assembler-mips.cc | 22 ----- src/mips/macro-assembler-mips.h | 1 - src/mips/simulator-mips.cc | 140 +++++++------------------------ src/mips/stub-cache-mips.cc | 70 ++++------------ 4 files changed, 49 insertions(+), 184 deletions(-) diff --git a/src/mips/macro-assembler-mips.cc b/src/mips/macro-assembler-mips.cc index 14a1e2fdca..ace7323ee9 100644 --- a/src/mips/macro-assembler-mips.cc +++ b/src/mips/macro-assembler-mips.cc @@ -3963,7 +3963,6 @@ void MacroAssembler::CallApiFunctionAndReturn(ExternalReference function, ExternalReference thunk_ref, Register thunk_last_arg, int stack_space, - bool returns_handle, int return_value_offset_from_fp) { ExternalReference next_address = ExternalReference::handle_scope_next_address(isolate()); @@ -3992,14 +3991,6 @@ void MacroAssembler::CallApiFunctionAndReturn(ExternalReference function, PopSafepointRegisters(); } - // The O32 ABI requires us to pass a pointer in a0 where the returned struct - // (4 bytes) will be placed. This is also built into the Simulator. - // Set up the pointer to the returned value (a0). It was allocated in - // EnterExitFrame. - if (returns_handle) { - addiu(a0, fp, ExitFrameConstants::kStackSpaceOffset); - } - Label profiler_disabled; Label end_profiler_check; bool* is_profiling_flag = @@ -4039,19 +4030,6 @@ void MacroAssembler::CallApiFunctionAndReturn(ExternalReference function, Label leave_exit_frame; Label return_value_loaded; - if (returns_handle) { - Label load_return_value; - - // As mentioned above, on MIPS a pointer is returned - we need to - // dereference it to get the actual return value (which is also a pointer). - lw(v0, MemOperand(v0)); - - Branch(&load_return_value, eq, v0, Operand(zero_reg)); - // Dereference returned value. - lw(v0, MemOperand(v0)); - Branch(&return_value_loaded); - bind(&load_return_value); - } // Load value from ReturnValue. lw(v0, MemOperand(fp, return_value_offset_from_fp*kPointerSize)); bind(&return_value_loaded); diff --git a/src/mips/macro-assembler-mips.h b/src/mips/macro-assembler-mips.h index 3b3cfdb8ac..9605038f88 100644 --- a/src/mips/macro-assembler-mips.h +++ b/src/mips/macro-assembler-mips.h @@ -1233,7 +1233,6 @@ class MacroAssembler: public Assembler { ExternalReference thunk_ref, Register thunk_last_arg, int stack_space, - bool returns_handle, int return_value_offset_from_fp); // Jump to the builtin routine. diff --git a/src/mips/simulator-mips.cc b/src/mips/simulator-mips.cc index 914a758662..ea8b65948a 100644 --- a/src/mips/simulator-mips.cc +++ b/src/mips/simulator-mips.cc @@ -1387,27 +1387,12 @@ typedef double (*SimulatorRuntimeFPIntCall)(double darg0, int32_t arg0); // This signature supports direct call in to API function native callback // (refer to InvocationCallback in v8.h). -// NOTE: the O32 abi requires a0 to hold a special pointer when returning a -// struct from the function (which is currently the case). This means we pass -// the first argument in a1 instead of a0. -typedef v8::Handle (*SimulatorRuntimeDirectApiCall)(int32_t arg0); -// Here, we pass the first argument in a0, because this function -// does not return a struct. -typedef void (*SimulatorRuntimeDirectApiCallNew)(int32_t arg0); -typedef v8::Handle (*SimulatorRuntimeProfilingApiCall)( - int32_t arg0, int32_t arg1); -typedef void (*SimulatorRuntimeProfilingApiCallNew)(int32_t arg0, int32_t arg1); +typedef void (*SimulatorRuntimeDirectApiCall)(int32_t arg0); +typedef void (*SimulatorRuntimeProfilingApiCall)(int32_t arg0, int32_t arg1); // This signature supports direct call to accessor getter callback. -// See comment at SimulatorRuntimeDirectApiCall. -typedef v8::Handle (*SimulatorRuntimeDirectGetterCall)(int32_t arg0, - int32_t arg1); -// See comment at SimulatorRuntimeDirectApiCallNew. -typedef void (*SimulatorRuntimeDirectGetterCallNew)(int32_t arg0, - int32_t arg1); -typedef v8::Handle (*SimulatorRuntimeProfilingGetterCall)( - int32_t arg0, int32_t arg1, int32_t arg2); -typedef void (*SimulatorRuntimeProfilingGetterCallNew)( +typedef void (*SimulatorRuntimeDirectGetterCall)(int32_t arg0, int32_t arg1); +typedef void (*SimulatorRuntimeProfilingGetterCall)( int32_t arg0, int32_t arg1, int32_t arg2); // Software interrupt instructions are used by the simulator to call into the @@ -1553,102 +1538,41 @@ void Simulator::SoftwareInterrupt(Instruction* instr) { break; } } - } else if ( - redirection->type() == ExternalReference::DIRECT_API_CALL || - redirection->type() == ExternalReference::DIRECT_API_CALL_NEW) { - if (redirection->type() == ExternalReference::DIRECT_API_CALL) { - // See comment at type definition of SimulatorRuntimeDirectApiCall - // for explanation of register usage. - if (::v8::internal::FLAG_trace_sim) { - PrintF("Call to host function at %p args %08x\n", - reinterpret_cast(external), arg1); - } - SimulatorRuntimeDirectApiCall target = - reinterpret_cast(external); - v8::Handle result = target(arg1); - *(reinterpret_cast(arg0)) = reinterpret_cast(*result); - set_register(v0, arg0); - } else { - if (::v8::internal::FLAG_trace_sim) { - PrintF("Call to host function at %p args %08x\n", - reinterpret_cast(external), arg0); - } - SimulatorRuntimeDirectApiCallNew target = - reinterpret_cast(external); - target(arg0); + } else if (redirection->type() == ExternalReference::DIRECT_API_CALL) { + if (::v8::internal::FLAG_trace_sim) { + PrintF("Call to host function at %p args %08x\n", + reinterpret_cast(external), arg0); } + SimulatorRuntimeDirectApiCall target = + reinterpret_cast(external); + target(arg0); } else if ( - redirection->type() == ExternalReference::PROFILING_API_CALL || - redirection->type() == ExternalReference::PROFILING_API_CALL_NEW) { - if (redirection->type() == ExternalReference::PROFILING_API_CALL) { - // See comment at type definition of SimulatorRuntimeDirectApiCall - // for explanation of register usage. - if (::v8::internal::FLAG_trace_sim) { - PrintF("Call to host function at %p args %08x %08x\n", - reinterpret_cast(external), arg1, arg2); - } - SimulatorRuntimeProfilingApiCall target = - reinterpret_cast(external); - v8::Handle result = target(arg1, arg2); - *(reinterpret_cast(arg0)) = reinterpret_cast(*result); - set_register(v0, arg0); - } else { - if (::v8::internal::FLAG_trace_sim) { - PrintF("Call to host function at %p args %08x %08x\n", - reinterpret_cast(external), arg0, arg1); - } - SimulatorRuntimeProfilingApiCallNew target = - reinterpret_cast(external); - target(arg0, arg1); + redirection->type() == ExternalReference::PROFILING_API_CALL) { + if (::v8::internal::FLAG_trace_sim) { + PrintF("Call to host function at %p args %08x %08x\n", + reinterpret_cast(external), arg0, arg1); } + SimulatorRuntimeProfilingApiCall target = + reinterpret_cast(external); + target(arg0, arg1); } else if ( - redirection->type() == ExternalReference::DIRECT_GETTER_CALL || - redirection->type() == ExternalReference::DIRECT_GETTER_CALL_NEW) { - if (redirection->type() == ExternalReference::DIRECT_GETTER_CALL) { - // See comment at type definition of SimulatorRuntimeDirectGetterCall - // for explanation of register usage. - if (::v8::internal::FLAG_trace_sim) { - PrintF("Call to host function at %p args %08x %08x\n", - reinterpret_cast(external), arg1, arg2); - } - SimulatorRuntimeDirectGetterCall target = - reinterpret_cast(external); - v8::Handle result = target(arg1, arg2); - *(reinterpret_cast(arg0)) = reinterpret_cast(*result); - set_register(v0, arg0); - } else { - if (::v8::internal::FLAG_trace_sim) { - PrintF("Call to host function at %p args %08x %08x\n", - reinterpret_cast(external), arg0, arg1); - } - SimulatorRuntimeDirectGetterCallNew target = - reinterpret_cast(external); - target(arg0, arg1); + redirection->type() == ExternalReference::DIRECT_GETTER_CALL) { + if (::v8::internal::FLAG_trace_sim) { + PrintF("Call to host function at %p args %08x %08x\n", + reinterpret_cast(external), arg0, arg1); } + SimulatorRuntimeDirectGetterCall target = + reinterpret_cast(external); + target(arg0, arg1); } else if ( - redirection->type() == ExternalReference::PROFILING_GETTER_CALL || - redirection->type() == ExternalReference::PROFILING_GETTER_CALL_NEW) { - if (redirection->type() == ExternalReference::PROFILING_GETTER_CALL) { - // See comment at type definition of SimulatorRuntimeProfilingGetterCall - // for explanation of register usage. - if (::v8::internal::FLAG_trace_sim) { - PrintF("Call to host function at %p args %08x %08x %08x\n", - reinterpret_cast(external), arg1, arg2, arg3); - } - SimulatorRuntimeProfilingGetterCall target = - reinterpret_cast(external); - v8::Handle result = target(arg1, arg2, arg3); - *(reinterpret_cast(arg0)) = reinterpret_cast(*result); - set_register(v0, arg0); - } else { - if (::v8::internal::FLAG_trace_sim) { - PrintF("Call to host function at %p args %08x %08x %08x\n", - reinterpret_cast(external), arg0, arg1, arg2); - } - SimulatorRuntimeProfilingGetterCallNew target = - reinterpret_cast(external); - target(arg0, arg1, arg2); + redirection->type() == ExternalReference::PROFILING_GETTER_CALL) { + if (::v8::internal::FLAG_trace_sim) { + PrintF("Call to host function at %p args %08x %08x %08x\n", + reinterpret_cast(external), arg0, arg1, arg2); } + SimulatorRuntimeProfilingGetterCall target = + reinterpret_cast(external); + target(arg0, arg1, arg2); } else { SimulatorRuntimeCall target = reinterpret_cast(external); diff --git a/src/mips/stub-cache-mips.cc b/src/mips/stub-cache-mips.cc index 9458c5e249..df779ff6a6 100644 --- a/src/mips/stub-cache-mips.cc +++ b/src/mips/stub-cache-mips.cc @@ -879,49 +879,31 @@ static void GenerateFastApiDirectCall(MacroAssembler* masm, FrameScope frame_scope(masm, StackFrame::MANUAL); __ EnterExitFrame(false, kApiStackSpace); - // NOTE: the O32 abi requires a0 to hold a special pointer when returning a - // struct from the function (which is currently the case). This means we pass - // the first argument in a1 instead of a0, if returns_handle is true. - // CallApiFunctionAndReturn will set up a0. - - Address function_address = v8::ToCData
(api_call_info->callback()); - // TODO(dcarney): fix signatures using returns_handle - const bool returns_handle = false; - - Register first_arg = returns_handle ? a1 : a0; - Register second_arg = returns_handle ? a2 : a1; - - // first_arg = v8::Arguments& + // a0 = v8::Arguments& // Arguments is built at sp + 1 (sp is a reserved spot for ra). - __ Addu(first_arg, sp, kPointerSize); + __ Addu(a0, sp, kPointerSize); // v8::Arguments::implicit_args_ - __ sw(a2, MemOperand(first_arg, 0 * kPointerSize)); + __ sw(a2, MemOperand(a0, 0 * kPointerSize)); // v8::Arguments::values_ __ Addu(t0, a2, Operand(argc * kPointerSize)); - __ sw(t0, MemOperand(first_arg, 1 * kPointerSize)); + __ sw(t0, MemOperand(a0, 1 * kPointerSize)); // v8::Arguments::length_ = argc __ li(t0, Operand(argc)); - __ sw(t0, MemOperand(first_arg, 2 * kPointerSize)); + __ sw(t0, MemOperand(a0, 2 * kPointerSize)); // v8::Arguments::is_construct_call = 0 - __ sw(zero_reg, MemOperand(first_arg, 3 * kPointerSize)); + __ sw(zero_reg, MemOperand(a0, 3 * kPointerSize)); const int kStackUnwindSpace = argc + kFastApiCallArguments + 1; + Address function_address = v8::ToCData
(api_call_info->callback()); ApiFunction fun(function_address); - ExternalReference::Type type = - returns_handle ? - ExternalReference::DIRECT_API_CALL : - ExternalReference::DIRECT_API_CALL_NEW; + ExternalReference::Type type = ExternalReference::DIRECT_API_CALL; ExternalReference ref = ExternalReference(&fun, type, masm->isolate()); - Address thunk_address = FUNCTION_ADDR(&InvokeFunctionCallback); - ExternalReference::Type thunk_type = - returns_handle ? - ExternalReference::PROFILING_API_CALL : - ExternalReference::PROFILING_API_CALL_NEW; + ExternalReference::Type thunk_type = ExternalReference::PROFILING_API_CALL; ApiFunction thunk_fun(thunk_address); ExternalReference thunk_ref = ExternalReference(&thunk_fun, thunk_type, masm->isolate()); @@ -930,9 +912,8 @@ static void GenerateFastApiDirectCall(MacroAssembler* masm, __ CallApiFunctionAndReturn(ref, function_address, thunk_ref, - second_arg, + a1, kStackUnwindSpace, - returns_handle, kFastApiCallArguments + 1); } @@ -1417,21 +1398,8 @@ void BaseLoadStubCompiler::GenerateLoadCallback( __ sw(scratch4(), MemOperand(sp, 1 * kPointerSize)); __ sw(name(), MemOperand(sp, 0 * kPointerSize)); - Address getter_address = v8::ToCData
(callback->getter()); - // TODO(dcarney): fix signatures using returns_handle - const bool returns_handle = false; - - Register first_arg = returns_handle ? a1 : a0; - Register second_arg = returns_handle ? a2 : a1; - Register third_arg = returns_handle ? a3 : a2; - __ mov(a2, scratch2()); // Saved in case scratch2 == a1. - __ mov(first_arg, sp); // (first argument - see note below) = Handle - - // NOTE: the O32 abi requires a0 to hold a special pointer when returning a - // struct from the function (which is currently the case). This means we pass - // the arguments in a1-a2 instead of a0-a1, if returns_handle is true. - // CallApiFunctionAndReturn will set up a0. + __ mov(a0, sp); // (first argument - a0) = Handle const int kApiStackSpace = 1; FrameScope frame_scope(masm(), StackFrame::MANUAL); @@ -1440,30 +1408,26 @@ void BaseLoadStubCompiler::GenerateLoadCallback( // Create AccessorInfo instance on the stack above the exit frame with // scratch2 (internal::Object** args_) as the data. __ sw(a2, MemOperand(sp, kPointerSize)); - // (second argument - see note above) = AccessorInfo& - __ Addu(second_arg, sp, kPointerSize); + // (second argument - a1) = AccessorInfo& + __ Addu(a1, sp, kPointerSize); const int kStackUnwindSpace = kFastApiCallArguments + 1; - + Address getter_address = v8::ToCData
(callback->getter()); ApiFunction fun(getter_address); - ExternalReference::Type type = - returns_handle ? - ExternalReference::DIRECT_GETTER_CALL : - ExternalReference::DIRECT_GETTER_CALL_NEW; + ExternalReference::Type type = ExternalReference::DIRECT_GETTER_CALL; ExternalReference ref = ExternalReference(&fun, type, isolate()); Address thunk_address = FUNCTION_ADDR(&InvokeAccessorGetterCallback); ExternalReference::Type thunk_type = - ExternalReference::PROFILING_GETTER_CALL_NEW; + ExternalReference::PROFILING_GETTER_CALL; ApiFunction thunk_fun(thunk_address); ExternalReference thunk_ref = ExternalReference(&thunk_fun, thunk_type, isolate()); __ CallApiFunctionAndReturn(ref, getter_address, thunk_ref, - third_arg, + a2, kStackUnwindSpace, - returns_handle, 5); }