| Index: runtime/vm/stub_code_x64.cc
|
| ===================================================================
|
| --- runtime/vm/stub_code_x64.cc (revision 25822)
|
| +++ runtime/vm/stub_code_x64.cc (working copy)
|
| @@ -28,6 +28,7 @@
|
| DECLARE_FLAG(int, optimization_counter_threshold);
|
| DECLARE_FLAG(bool, trace_optimized_ic_calls);
|
|
|
| +
|
| // Input parameters:
|
| // RSP : points to return address.
|
| // RSP + 8 : address of last argument in argument array.
|
| @@ -161,6 +162,75 @@
|
| __ leaq(RAX, Address(RBP, 2 * kWordSize)); // Compute return value addr.
|
| __ movq(Address(RSP, retval_offset), RAX); // Set retval in NativeArguments.
|
| __ movq(RDI, RSP); // Pass the pointer to the NativeArguments.
|
| + __ movq(RSI, RBX); // Pass pointer to function entrypoint.
|
| + __ call(&NativeEntry::NativeCallWrapperLabel());
|
| +
|
| + // Reset exit frame information in Isolate structure.
|
| + __ movq(Address(CTX, Isolate::top_exit_frame_info_offset()), Immediate(0));
|
| +
|
| + // Load Context pointer from Isolate structure into R8.
|
| + __ movq(R8, Address(CTX, Isolate::top_context_offset()));
|
| +
|
| + // Reset Context pointer in Isolate structure.
|
| + const Immediate& raw_null =
|
| + Immediate(reinterpret_cast<intptr_t>(Object::null()));
|
| + __ movq(Address(CTX, Isolate::top_context_offset()), raw_null);
|
| +
|
| + // Cache Context pointer into CTX while executing Dart code.
|
| + __ movq(CTX, R8);
|
| +
|
| + __ LeaveFrame();
|
| + __ ret();
|
| +}
|
| +
|
| +
|
| +// Input parameters:
|
| +// RSP : points to return address.
|
| +// RSP + 8 : address of return value.
|
| +// RAX : address of first argument in argument array.
|
| +// RBX : address of the native function to call.
|
| +// R10 : argc_tag including number of arguments and function kind.
|
| +void StubCode::GenerateCallBootstrapCFunctionStub(Assembler* assembler) {
|
| + const intptr_t native_args_struct_offset = 0;
|
| + const intptr_t isolate_offset =
|
| + NativeArguments::isolate_offset() + native_args_struct_offset;
|
| + const intptr_t argc_tag_offset =
|
| + NativeArguments::argc_tag_offset() + native_args_struct_offset;
|
| + const intptr_t argv_offset =
|
| + NativeArguments::argv_offset() + native_args_struct_offset;
|
| + const intptr_t retval_offset =
|
| + NativeArguments::retval_offset() + native_args_struct_offset;
|
| +
|
| + __ EnterFrame(0);
|
| +
|
| + // Load current Isolate pointer from Context structure into R8.
|
| + __ movq(R8, FieldAddress(CTX, Context::isolate_offset()));
|
| +
|
| + // Save exit frame information to enable stack walking as we are about
|
| + // to transition to native code.
|
| + __ movq(Address(R8, Isolate::top_exit_frame_info_offset()), RSP);
|
| +
|
| + // Save current Context pointer into Isolate structure.
|
| + __ movq(Address(R8, Isolate::top_context_offset()), CTX);
|
| +
|
| + // Cache Isolate pointer into CTX while executing native code.
|
| + __ movq(CTX, R8);
|
| +
|
| + // Reserve space for the native arguments structure passed on the stack (the
|
| + // outgoing pointer parameter to the native arguments structure is passed in
|
| + // RDI) and align frame before entering the C++ world.
|
| + __ AddImmediate(RSP, Immediate(-sizeof(NativeArguments)));
|
| + if (OS::ActivationFrameAlignment() > 0) {
|
| + __ andq(RSP, Immediate(~(OS::ActivationFrameAlignment() - 1)));
|
| + }
|
| +
|
| + // Pass NativeArguments structure by value and call native function.
|
| + __ movq(Address(RSP, isolate_offset), CTX); // Set isolate in NativeArgs.
|
| + __ movq(Address(RSP, argc_tag_offset), R10); // Set argc in NativeArguments.
|
| + __ movq(Address(RSP, argv_offset), RAX); // Set argv in NativeArguments.
|
| + __ leaq(RAX, Address(RBP, 2 * kWordSize)); // Compute return value addr.
|
| + __ movq(Address(RSP, retval_offset), RAX); // Set retval in NativeArguments.
|
| + __ movq(RDI, RSP); // Pass the pointer to the NativeArguments.
|
| __ call(RBX);
|
|
|
| // Reset exit frame information in Isolate structure.
|
|
|