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:
Jan de Mooij 2019-05-16 08:56:53 +00:00
parent 25c2664041
commit 3542b77c41
2 changed files with 19 additions and 21 deletions

View File

@ -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);

View File

@ -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);