diff options
Diffstat (limited to 'Source/JavaScriptCore/dfg/DFGToFTLForOSREntryDeferredCompilationCallback.cpp')
-rw-r--r-- | Source/JavaScriptCore/dfg/DFGToFTLForOSREntryDeferredCompilationCallback.cpp | 55 |
1 files changed, 34 insertions, 21 deletions
diff --git a/Source/JavaScriptCore/dfg/DFGToFTLForOSREntryDeferredCompilationCallback.cpp b/Source/JavaScriptCore/dfg/DFGToFTLForOSREntryDeferredCompilationCallback.cpp index 17b45a328..ae815422e 100644 --- a/Source/JavaScriptCore/dfg/DFGToFTLForOSREntryDeferredCompilationCallback.cpp +++ b/Source/JavaScriptCore/dfg/DFGToFTLForOSREntryDeferredCompilationCallback.cpp @@ -30,13 +30,13 @@ #include "CodeBlock.h" #include "DFGJITCode.h" -#include "Executable.h" +#include "FTLForOSREntryJITCode.h" +#include "JSCInlines.h" namespace JSC { namespace DFG { -ToFTLForOSREntryDeferredCompilationCallback::ToFTLForOSREntryDeferredCompilationCallback( - PassRefPtr<CodeBlock> dfgCodeBlock) - : m_dfgCodeBlock(dfgCodeBlock) +ToFTLForOSREntryDeferredCompilationCallback::ToFTLForOSREntryDeferredCompilationCallback(JITCode::TriggerReason* forcedOSREntryTrigger) + : m_forcedOSREntryTrigger(forcedOSREntryTrigger) { } @@ -44,42 +44,55 @@ ToFTLForOSREntryDeferredCompilationCallback::~ToFTLForOSREntryDeferredCompilatio { } -PassRefPtr<ToFTLForOSREntryDeferredCompilationCallback> -ToFTLForOSREntryDeferredCompilationCallback::create( - PassRefPtr<CodeBlock> dfgCodeBlock) +Ref<ToFTLForOSREntryDeferredCompilationCallback>ToFTLForOSREntryDeferredCompilationCallback::create(JITCode::TriggerReason* forcedOSREntryTrigger) { - return adoptRef(new ToFTLForOSREntryDeferredCompilationCallback(dfgCodeBlock)); + return adoptRef(*new ToFTLForOSREntryDeferredCompilationCallback(forcedOSREntryTrigger)); } void ToFTLForOSREntryDeferredCompilationCallback::compilationDidBecomeReadyAsynchronously( - CodeBlock* codeBlock) + CodeBlock* codeBlock, CodeBlock* profiledDFGCodeBlock) { if (Options::verboseOSR()) { dataLog( - "Optimizing compilation of ", *codeBlock, " (for ", *m_dfgCodeBlock, + "Optimizing compilation of ", *codeBlock, " (for ", *profiledDFGCodeBlock, ") did become ready.\n"); } - - m_dfgCodeBlock->jitCode()->dfg()->forceOptimizationSlowPathConcurrently( - m_dfgCodeBlock.get()); + + *m_forcedOSREntryTrigger = JITCode::TriggerReason::CompilationDone; } void ToFTLForOSREntryDeferredCompilationCallback::compilationDidComplete( - CodeBlock* codeBlock, CompilationResult result) + CodeBlock* codeBlock, CodeBlock* profiledDFGCodeBlock, CompilationResult result) { if (Options::verboseOSR()) { dataLog( - "Optimizing compilation of ", *codeBlock, " (for ", *m_dfgCodeBlock, + "Optimizing compilation of ", *codeBlock, " (for ", *profiledDFGCodeBlock, ") result: ", result, "\n"); } - if (result == CompilationSuccessful) - m_dfgCodeBlock->jitCode()->dfg()->osrEntryBlock = codeBlock; + JITCode* jitCode = profiledDFGCodeBlock->jitCode()->dfg(); + + switch (result) { + case CompilationSuccessful: { + jitCode->setOSREntryBlock(*codeBlock->vm(), profiledDFGCodeBlock, codeBlock); + unsigned osrEntryBytecode = codeBlock->jitCode()->ftlForOSREntry()->bytecodeIndex(); + jitCode->tierUpEntryTriggers.set(osrEntryBytecode, JITCode::TriggerReason::CompilationDone); + break; + } + case CompilationFailed: + jitCode->osrEntryRetry = 0; + jitCode->abandonOSREntry = true; + profiledDFGCodeBlock->jitCode()->dfg()->setOptimizationThresholdBasedOnCompilationResult( + profiledDFGCodeBlock, result); + break; + case CompilationDeferred: + RELEASE_ASSERT_NOT_REACHED(); + case CompilationInvalidated: + jitCode->osrEntryRetry = 0; + break; + } - // FIXME: if we failed, we might want to just turn off OSR entry rather than - // totally turning off tier-up. - m_dfgCodeBlock->jitCode()->dfg()->setOptimizationThresholdBasedOnCompilationResult( - m_dfgCodeBlock.get(), result); + DeferredCompilationCallback::compilationDidComplete(codeBlock, profiledDFGCodeBlock, result); } } } // JSC::DFG |