[wasm] Save FP & PC when calling C functions (x64 only)

This change is needed for profiling of Wasm code that calls C-function
to ignore the C-stack above the Wasm stack that otherwise couldn't be
parsed otherwise.

R=clemensb@chromium.org
R=petermarshall@chromium.org
R=jgruber@chromium.org

Bug: chromium:1045860
Change-Id: Ia0788189ca666e77f1564576903c1dc4fd745b8d
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2066964
Commit-Queue: Emanuel Ziegler <ecmziegler@chromium.org>
Reviewed-by: Peter Marshall <petermarshall@chromium.org>
Reviewed-by: Clemens Backes <clemensb@chromium.org>
Cr-Commit-Position: refs/heads/master@{#66408}
This commit is contained in:
Emanuel Ziegler 2020-02-24 10:18:41 +01:00 committed by Commit Bot
parent 75931f18ee
commit 1a2a812382
2 changed files with 23 additions and 6 deletions

View File

@ -2651,26 +2651,35 @@ void TurboAssembler::CallCFunction(Register function, int num_arguments) {
// Save the frame pointer and PC so that the stack layout remains iterable,
// even without an ExitFrame which normally exists between JS and C frames.
if (isolate() != nullptr) {
if (isolate() != nullptr || root_array_available_) {
Label get_pc;
DCHECK(!AreAliased(kScratchRegister, function));
leaq(kScratchRegister, Operand(&get_pc, 0));
bind(&get_pc);
movq(ExternalReferenceAsOperand(
ExternalReference::fast_c_call_caller_pc_address(isolate())),
movq(isolate() != nullptr
? ExternalReferenceAsOperand(
ExternalReference::fast_c_call_caller_pc_address(isolate()))
: Operand(kRootRegister,
IsolateData::fast_c_call_caller_pc_offset()),
kScratchRegister);
movq(ExternalReferenceAsOperand(
ExternalReference::fast_c_call_caller_fp_address(isolate())),
movq(isolate() != nullptr
? ExternalReferenceAsOperand(
ExternalReference::fast_c_call_caller_fp_address(isolate()))
: Operand(kRootRegister,
IsolateData::fast_c_call_caller_fp_offset()),
rbp);
}
call(function);
// We don't unset the PC; the FP is the source of truth.
if (isolate() != nullptr) {
// We don't unset the PC; the FP is the source of truth.
movq(ExternalReferenceAsOperand(
ExternalReference::fast_c_call_caller_fp_address(isolate())),
Immediate(0));
} else if (root_array_available_) {
movq(Operand(kRootRegister, IsolateData::fast_c_call_caller_fp_offset()),
Immediate(0));
}
DCHECK_NE(base::OS::ActivationFrameAlignment(), 0);

View File

@ -62,6 +62,14 @@ class IsolateData final {
return kBuiltinsTableOffset - kIsolateRootBias;
}
static constexpr int fast_c_call_caller_fp_offset() {
return kFastCCallCallerFPOffset - kIsolateRootBias;
}
static constexpr int fast_c_call_caller_pc_offset() {
return kFastCCallCallerPCOffset - kIsolateRootBias;
}
// Root-register-relative offset of the given builtin table entry.
// TODO(ishell): remove in favour of typified id version.
static int builtin_slot_offset(int builtin_index) {