summaryrefslogtreecommitdiff
path: root/deps/v8/src/deoptimizer/arm64/deoptimizer-arm64.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/deoptimizer/arm64/deoptimizer-arm64.cc')
-rw-r--r--deps/v8/src/deoptimizer/arm64/deoptimizer-arm64.cc18
1 files changed, 18 insertions, 0 deletions
diff --git a/deps/v8/src/deoptimizer/arm64/deoptimizer-arm64.cc b/deps/v8/src/deoptimizer/arm64/deoptimizer-arm64.cc
index 82ae764e50..17091259d6 100644
--- a/deps/v8/src/deoptimizer/arm64/deoptimizer-arm64.cc
+++ b/deps/v8/src/deoptimizer/arm64/deoptimizer-arm64.cc
@@ -189,6 +189,15 @@ void Deoptimizer::GenerateDeoptimizationEntries(MacroAssembler* masm,
CopyRegListToFrame(masm, x1, FrameDescription::double_registers_offset(),
saved_double_registers, x2, x3, kDoubleRegistersOffset);
+ // Mark the stack as not iterable for the CPU profiler which won't be able to
+ // walk the stack without the return address.
+ {
+ UseScratchRegisterScope temps(masm);
+ Register is_iterable = temps.AcquireX();
+ __ Mov(is_iterable, ExternalReference::stack_is_iterable_address(isolate));
+ __ strb(xzr, MemOperand(is_iterable));
+ }
+
// Remove the saved registers from the stack.
DCHECK_EQ(kSavedRegistersAreaSize % kXRegSize, 0);
__ Drop(kSavedRegistersAreaSize / kXRegSize);
@@ -251,6 +260,15 @@ void Deoptimizer::GenerateDeoptimizationEntries(MacroAssembler* masm,
RestoreRegList(masm, saved_double_registers, x1,
FrameDescription::double_registers_offset());
+ {
+ UseScratchRegisterScope temps(masm);
+ Register is_iterable = temps.AcquireX();
+ Register one = x4;
+ __ Mov(is_iterable, ExternalReference::stack_is_iterable_address(isolate));
+ __ Mov(one, Operand(1));
+ __ strb(one, MemOperand(is_iterable));
+ }
+
// TODO(all): ARM copies a lot (if not all) of the last output frame onto the
// stack, then pops it all into registers. Here, we try to load it directly
// into the relevant registers. Is this correct? If so, we should improve the