Commit dadb59eb authored by Yu Yin's avatar Yu Yin Committed by Commit Bot

[mips][counters] Introduce proper bottleneck for FunctionCallback.

Port ea420655 https://crrev.com/c/1651470

Original Commit Message:

    API calls made via the CallApiCallback builtin, which is used from the
    ICs and optimized code, are currently misattributed to the wrong counter
    InvokeFunctionCallback instead of FunctionCallback. In addition we don't
    use the C trampoline when only runtime call stats are enabled, but the
    Chrome DevTools profiler is not active, which means that these calls
    will not be attrituted properly at all, and that had to be worked around
    using all kinds of tricks (i.e. disabling fast-paths in ICs when RCS is
    active and not inlining calls/property accesses into optimized code
    depending on the state of RCS).

    All of this was really brittle and only due to the fact that the central
    builtin didn't properly check for RCS (in addition to checking for the
    CDT profiler). With this fix it's now handled in a central place and
    attributed to the correct category, so user code doesn't need to worry
    about RCS anymore and can just call straight into the fast-path.

    core hand-written native code with the API callback logic.

Change-Id: I6bcc8c4d7f4642381803a8b6c8282ceb8f3d056c
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1659988
Commit-Queue: Benedikt Meurer <bmeurer@chromium.org>
Reviewed-by: 's avatarBenedikt Meurer <bmeurer@chromium.org>
Cr-Commit-Position: refs/heads/master@{#62163}
parent 6676f570
......@@ -2828,18 +2828,23 @@ void CallApiFunctionAndReturn(MacroAssembler* masm, Register function_address,
DCHECK(function_address == a1 || function_address == a2);
Label profiler_disabled;
Label end_profiler_check;
Label profiler_enabled, end_profiler_check;
__ li(t9, ExternalReference::is_profiling_address(isolate));
__ lb(t9, MemOperand(t9, 0));
__ Branch(&profiler_disabled, eq, t9, Operand(zero_reg));
// Additional parameter is the address of the actual callback.
__ li(t9, thunk_ref);
__ jmp(&end_profiler_check);
__ bind(&profiler_disabled);
__ mov(t9, function_address);
__ Branch(&profiler_enabled, ne, t9, Operand(zero_reg));
__ li(t9, ExternalReference::address_of_runtime_stats_flag());
__ lb(t9, MemOperand(t9, 0));
__ Branch(&profiler_enabled, ne, t9, Operand(zero_reg));
{
// Call the api function directly.
__ mov(t9, function_address);
__ Branch(&end_profiler_check);
}
__ bind(&profiler_enabled);
{
// Additional parameter is the address of the actual callback.
__ li(t9, thunk_ref);
}
__ bind(&end_profiler_check);
// Allocate HandleScope in callee-save registers.
......
......@@ -2868,18 +2868,24 @@ void CallApiFunctionAndReturn(MacroAssembler* masm, Register function_address,
DCHECK(function_address == a1 || function_address == a2);
Label profiler_disabled;
Label end_profiler_check;
Label profiler_enabled, end_profiler_check;
__ li(t9, ExternalReference::is_profiling_address(isolate));
__ Lb(t9, MemOperand(t9, 0));
__ Branch(&profiler_disabled, eq, t9, Operand(zero_reg));
// Additional parameter is the address of the actual callback.
__ li(t9, thunk_ref);
__ jmp(&end_profiler_check);
__ Branch(&profiler_enabled, ne, t9, Operand(zero_reg));
__ li(t9, ExternalReference::address_of_runtime_stats_flag());
__ Lb(t9, MemOperand(t9, 0));
__ Branch(&profiler_enabled, ne, t9, Operand(zero_reg));
{
// Call the api function directly.
__ mov(t9, function_address);
__ Branch(&end_profiler_check);
}
__ bind(&profiler_disabled);
__ mov(t9, function_address);
__ bind(&profiler_enabled);
{
// Additional parameter is the address of the actual callback.
__ li(t9, thunk_ref);
}
__ bind(&end_profiler_check);
// Allocate HandleScope in callee-save registers.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment