mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-10 03:45:46 +00:00
Bug 1541404 part 34 - Fix BaselineDebugModeOSR to also recompile interpreter frames. r=tcampbell
This matches what we do for C++-interpreter frames in CollectInterpreterStackScripts and SkipInterpreterFrameEntries. It's necessary for Interpreter => JIT OSR to work correctly. This fixes remaining jit-test failures with --blinterp-eager Differential Revision: https://phabricator.services.mozilla.com/D31050 --HG-- extra : moz-landing-system : lando
This commit is contained in:
parent
25c2664041
commit
3542b77c41
@ -166,14 +166,18 @@ static bool CollectJitStackScripts(JSContext* cx,
|
||||
break;
|
||||
}
|
||||
|
||||
// Baseline Interpreter frames don't need recompilation.
|
||||
BaselineFrame* baselineFrame = frame.baselineFrame();
|
||||
if (baselineFrame->runningInInterpreter()) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (BaselineDebugModeOSRInfo* info =
|
||||
baselineFrame->getDebugModeOSRInfo()) {
|
||||
if (baselineFrame->runningInInterpreter()) {
|
||||
// Baseline Interpreter frames for scripts that have a BaselineScript
|
||||
// or IonScript don't need to be patched but they do need to be
|
||||
// invalidated and recompiled. See also CollectInterpreterStackScripts
|
||||
// for C++ interpreter frames.
|
||||
if (!entries.append(DebugModeOSREntry(script))) {
|
||||
return false;
|
||||
}
|
||||
} else if (BaselineDebugModeOSRInfo* info =
|
||||
baselineFrame->getDebugModeOSRInfo()) {
|
||||
// If patching a previously patched yet unpopped frame, we can
|
||||
// use the BaselineDebugModeOSRInfo on the frame directly to
|
||||
// patch. Indeed, we cannot use frame.resumePCinCurrentFrame(), as
|
||||
@ -362,12 +366,6 @@ static void PatchBaselineFramesForDebugMode(
|
||||
break;
|
||||
}
|
||||
|
||||
// Baseline Interpreter frames don't need recompilation.
|
||||
BaselineFrame* baselineFrame = frame.baselineFrame();
|
||||
if (baselineFrame->runningInInterpreter()) {
|
||||
break;
|
||||
}
|
||||
|
||||
DebugModeOSREntry& entry = entries[entryIndex];
|
||||
|
||||
if (!entry.recompiled()) {
|
||||
@ -375,6 +373,14 @@ static void PatchBaselineFramesForDebugMode(
|
||||
break;
|
||||
}
|
||||
|
||||
BaselineFrame* baselineFrame = frame.baselineFrame();
|
||||
if (baselineFrame->runningInInterpreter()) {
|
||||
// We recompiled the script's BaselineScript but Baseline Interpreter
|
||||
// frames don't need to be patched.
|
||||
entryIndex++;
|
||||
break;
|
||||
}
|
||||
|
||||
JSScript* script = entry.script;
|
||||
uint32_t pcOffset = entry.pcOffset;
|
||||
jsbytecode* pc = script->offsetToPC(pcOffset);
|
||||
|
@ -2988,15 +2988,7 @@ static bool UpdateExecutionObservabilityOfScriptsInZone(
|
||||
const JSJitFrameIter& frame = iter.frame();
|
||||
switch (frame.type()) {
|
||||
case FrameType::BaselineJS:
|
||||
// BaselineScripts that are active on the stack get recompiled and
|
||||
// other (affected) BaselineScripts are discarded. If we're running in
|
||||
// the Baseline Interpreter don't mark the script as active here to
|
||||
// prevent BaselineScripts from falling through the cracks: when we
|
||||
// don't dicard them here (because active) and also don't recompile
|
||||
// them (because recompilation skips interpreter frames).
|
||||
if (!frame.baselineFrame()->runningInInterpreter()) {
|
||||
MarkTypeScriptActiveIfObservable(frame.script(), obs);
|
||||
}
|
||||
MarkTypeScriptActiveIfObservable(frame.script(), obs);
|
||||
break;
|
||||
case FrameType::IonJS:
|
||||
MarkTypeScriptActiveIfObservable(frame.script(), obs);
|
||||
|
Loading…
Reference in New Issue
Block a user