source: webkit/trunk/Source/JavaScriptCore/dfg/DFGJITFinalizer.cpp

Last change on this file was 293605, checked in by [email protected], 3 years ago

[JSC] Make DFG::OSRExit data unlinked
https://bugs.webkit.org/show_bug.cgi?id=239828

Reviewed by Saam Barati.

This patch makes DFG::OSRExit unlinked. While generated OSR exit code is linked version,
we no longer put linked data to DFG::OSRExit so that unlinked DFG can use DFG::OSRExit.
Key changes are two things.

  1. Now, we always store compiled MacroAssemblerCodeRef in DFG::JITData regardless of whether we have linked / unlinked DFG. While linked DFG uses repatching to jump to this code, unlinked DFG looks into this vector in JITData and jump to that.
  2. MethodOfGettingAValueProfile was including CodeBlock*, ValueProfile* in CodeBlock* etc., so it was linked data structure which unlinked DFG cannot use. Instead, we encode how to retrieve these pointers when generating OSR exit code actually, and just storing CodeOrigin, type, and Operand to make MethodOfGettingAValueProfile unlinked data structure. While CodeOrigin can include InlineCallFrame, but our first version of unlinked DFG will not perform inlining thus we will not include it. It also makes sizeof(MethodOfGettingAValueProfile) smaller from 32 bytes to 16 bytes (50% reduction).
  • Source/JavaScriptCore/assembler/MacroAssemblerCodeRef.h:

(JSC::MacroAssemblerCodeRef::offsetOfCodePtr):

  • Source/JavaScriptCore/bytecode/CodeBlock.cpp:

(JSC::CodeBlock::updateOSRExitCounterAndCheckIfNeedToReoptimize): Deleted.

  • Source/JavaScriptCore/bytecode/CodeBlock.h:
  • Source/JavaScriptCore/bytecode/MethodOfGettingAValueProfile.cpp:

(JSC::MethodOfGettingAValueProfile::emitReportValue const):
(JSC::MethodOfGettingAValueProfile::fromLazyOperand): Deleted.
(JSC::MethodOfGettingAValueProfile::reportValue): Deleted.

  • Source/JavaScriptCore/bytecode/MethodOfGettingAValueProfile.h:

(JSC::MethodOfGettingAValueProfile::unaryArithProfile):
(JSC::MethodOfGettingAValueProfile::binaryArithProfile):
(JSC::MethodOfGettingAValueProfile::argumentValueProfile):
(JSC::MethodOfGettingAValueProfile::bytecodeValueProfile):
(JSC::MethodOfGettingAValueProfile::lazyOperandValueProfile):
(JSC::MethodOfGettingAValueProfile::operator bool const):
(JSC::MethodOfGettingAValueProfile::MethodOfGettingAValueProfile): Deleted.

  • Source/JavaScriptCore/dfg/DFGGraph.cpp:

(JSC::DFG::Graph::methodOfGettingAValueProfileFor):

  • Source/JavaScriptCore/dfg/DFGJITCode.cpp:

(JSC::DFG::JITCode::JITCode):
(JSC::DFG::JITCode::findPC):

  • Source/JavaScriptCore/dfg/DFGJITCode.h:
  • Source/JavaScriptCore/dfg/DFGJITCompiler.cpp:

(JSC::DFG::JITCompiler::JITCompiler):
(JSC::DFG::JITCompiler::linkOSRExits):
(JSC::DFG::JITCompiler::link):

  • Source/JavaScriptCore/dfg/DFGJITFinalizer.cpp:

(JSC::DFG::JITFinalizer::finalize):

  • Source/JavaScriptCore/dfg/DFGOSRExit.cpp:

(JSC::DFG::JSC_DEFINE_JIT_OPERATION):
(JSC::DFG::OSRExit::compileExit):
(JSC::DFG::OSRExit::codeLocationForRepatch const): Deleted.

  • Source/JavaScriptCore/dfg/DFGOSRExit.h:

(JSC::DFG::OSRExit::codeLocationForRepatch const):
(JSC::DFG::OSRExitState::OSRExitState): Deleted.

  • Source/JavaScriptCore/dfg/DFGPlan.cpp:

(JSC::DFG::Plan::finalizeJITData):

  • Source/JavaScriptCore/dfg/DFGPlan.h:
  • Source/JavaScriptCore/ftl/FTLLowerDFGToB3.cpp:

(JSC::FTL::DFG::LowerDFGToB3::lower):

  • Source/JavaScriptCore/ftl/FTLOSRExitCompiler.cpp:

(JSC::FTL::compileStub):

  • Source/WTF/wtf/FixedVector.h:

Canonical link: https://commits.webkit.org/250111@main

File size: 2.8 KB
Line 
1/*
2 * Copyright (C) 2013-2021 Apple Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#include "config.h"
27#include "DFGJITFinalizer.h"
28
29#if ENABLE(DFG_JIT)
30
31#include "CodeBlock.h"
32#include "CodeBlockWithJITType.h"
33#include "DFGPlan.h"
34#include "HeapInlines.h"
35#include "ProfilerDatabase.h"
36
37namespace JSC { namespace DFG {
38
39JITFinalizer::JITFinalizer(Plan& plan, Ref<JITCode>&& jitCode, std::unique_ptr<LinkBuffer> linkBuffer, MacroAssemblerCodePtr<JSEntryPtrTag> withArityCheck)
40 : Finalizer(plan)
41 , m_jitCode(WTFMove(jitCode))
42 , m_linkBuffer(WTFMove(linkBuffer))
43 , m_withArityCheck(withArityCheck)
44{
45}
46
47JITFinalizer::~JITFinalizer()
48{
49}
50
51size_t JITFinalizer::codeSize()
52{
53 return m_linkBuffer->size();
54}
55
56bool JITFinalizer::finalize()
57{
58 VM& vm = *m_plan.vm();
59
60 WTF::crossModifyingCodeFence();
61
62 m_linkBuffer->runMainThreadFinalizationTasks();
63
64 CodeBlock* codeBlock = m_plan.codeBlock();
65
66 codeBlock->setJITCode(m_jitCode.copyRef());
67 codeBlock->setDFGJITData(m_plan.finalizeJITData(m_jitCode.get()));
68
69#if ENABLE(FTL_JIT)
70 m_jitCode->optimizeAfterWarmUp(codeBlock);
71#endif // ENABLE(FTL_JIT)
72
73 if (UNLIKELY(m_plan.compilation()))
74 vm.m_perBytecodeProfiler->addCompilation(codeBlock, *m_plan.compilation());
75
76 if (!m_plan.willTryToTierUp())
77 codeBlock->baselineVersion()->m_didFailFTLCompilation = true;
78
79 // The codeBlock is now responsible for keeping many things alive (e.g. frozen values)
80 // that were previously kept alive by the plan.
81 vm.writeBarrier(codeBlock);
82
83 return true;
84}
85
86} } // namespace JSC::DFG
87
88#endif // ENABLE(DFG_JIT)
Note: See TracBrowser for help on using the repository browser.