Commit b3051413 authored by Victor Gomes's avatar Victor Gomes Committed by V8 LUCI CQ

[maglev] Fixes LookupExceptionHandlerInTable

Maglev uses a different safepoint table. This CL introduces the
functions FindReturnPCForTrampoline for MaglevFrame and TurboFanFrame.

Bug: v8:7700, chromium:1356902
Change-Id: I90784ddfdc96604c5ada8047e6f7447c17e6c3aa
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3859342
Commit-Queue: Leszek Swirski <leszeks@chromium.org>
Reviewed-by: 's avatarLeszek Swirski <leszeks@chromium.org>
Auto-Submit: Victor Gomes <victorgomes@chromium.org>
Commit-Queue: Victor Gomes <victorgomes@chromium.org>
Cr-Commit-Position: refs/heads/main@{#82742}
parent 6fb86b97
......@@ -40,6 +40,16 @@ MaglevSafepointTable::MaglevSafepointTable(Address instruction_start,
num_untagged_slots_(base::Memory<uint32_t>(safepoint_table_address +
kNumUntaggedSlotsOffset)) {}
int MaglevSafepointTable::find_return_pc(int pc_offset) {
for (int i = 0; i < length(); i++) {
MaglevSafepointEntry entry = GetEntry(i);
if (entry.trampoline_pc() == pc_offset || entry.pc() == pc_offset) {
return entry.pc();
}
}
UNREACHABLE();
}
MaglevSafepointEntry MaglevSafepointTable::FindEntry(Address pc) const {
int pc_offset = static_cast<int>(pc - instruction_start_);
......
......@@ -74,6 +74,8 @@ class MaglevSafepointTable {
int byte_size() const { return kHeaderSize + length_ * entry_size(); }
int find_return_pc(int pc_offset);
MaglevSafepointEntry GetEntry(int index) const {
DCHECK_GT(length_, index);
Address entry_ptr =
......
......@@ -2242,7 +2242,10 @@ int OptimizedFrame::LookupExceptionHandlerInTable(
// code to perform prediction there.
DCHECK_NULL(prediction);
CodeT code = LookupCodeT().ToCodeT();
HandlerTable table(code);
if (table.NumberOfReturnEntries() == 0) return -1;
int pc_offset = code.GetOffsetFromInstructionStart(isolate(), pc());
DCHECK_NULL(data); // Data is not used and will not return a value.
......@@ -2250,12 +2253,27 @@ int OptimizedFrame::LookupExceptionHandlerInTable(
// a handler for this trampoline. Thus we need to use the return pc that
// _used to be_ on the stack to get the right ExceptionHandler.
if (CodeKindCanDeoptimize(code.kind()) && code.marked_for_deoptimization()) {
SafepointTable safepoints(isolate(), pc(), code);
pc_offset = safepoints.find_return_pc(pc_offset);
pc_offset = FindReturnPCForTrampoline(code, pc_offset);
}
return table.LookupReturn(pc_offset);
}
int MaglevFrame::FindReturnPCForTrampoline(CodeT code,
int trampoline_pc) const {
DCHECK_EQ(code.kind(), CodeKind::MAGLEV);
DCHECK(code.marked_for_deoptimization());
MaglevSafepointTable safepoints(isolate(), pc(), code);
return safepoints.find_return_pc(trampoline_pc);
}
int TurbofanFrame::FindReturnPCForTrampoline(CodeT code,
int trampoline_pc) const {
DCHECK_EQ(code.kind(), CodeKind::TURBOFAN);
DCHECK(code.marked_for_deoptimization());
SafepointTable safepoints(isolate(), pc(), code);
return safepoints.find_return_pc(trampoline_pc);
}
DeoptimizationData OptimizedFrame::GetDeoptimizationData(
int* deopt_index) const {
DCHECK(is_optimized());
......
......@@ -830,6 +830,9 @@ class OptimizedFrame : public JavaScriptFrame {
int LookupExceptionHandlerInTable(
int* data, HandlerTable::CatchPrediction* prediction) override;
virtual int FindReturnPCForTrampoline(CodeT code,
int trampoline_pc) const = 0;
protected:
inline explicit OptimizedFrame(StackFrameIteratorBase* iterator);
};
......@@ -939,6 +942,8 @@ class MaglevFrame : public OptimizedFrame {
void Iterate(RootVisitor* v) const override;
int FindReturnPCForTrampoline(CodeT code, int trampoline_pc) const override;
protected:
inline explicit MaglevFrame(StackFrameIteratorBase* iterator);
......@@ -955,6 +960,8 @@ class TurbofanFrame : public OptimizedFrame {
void Iterate(RootVisitor* v) const override;
int FindReturnPCForTrampoline(CodeT code, int trampoline_pc) const override;
protected:
inline explicit TurbofanFrame(StackFrameIteratorBase* iterator);
......
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