blob: 7643eda6decc1e3a76d52d729808dbcd407ba6b5 [file] [log] [blame]
oliver@apple.com90fce822013-07-25 04:00:13 +00001/*
mark.lam@apple.com03313a92018-02-27 07:50:54 +00002 * Copyright (C) 2013-2018 Apple Inc. All rights reserved.
oliver@apple.com90fce822013-07-25 04:00:13 +00003 *
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 "FTLJITFinalizer.h"
28
29#if ENABLE(FTL_JIT)
30
31#include "CodeBlockWithJITType.h"
32#include "DFGPlan.h"
fpizlo@apple.combce60f82015-11-19 20:03:22 +000033#include "FTLState.h"
fpizlo@apple.com50cd41c2013-10-10 22:57:10 +000034#include "FTLThunks.h"
fpizlo@apple.combc16ddb2016-09-06 01:02:22 +000035#include "JSCInlines.h"
fpizlo@apple.com1d160762014-03-22 23:18:04 +000036#include "ProfilerDatabase.h"
oliver@apple.com90fce822013-07-25 04:00:13 +000037
38namespace JSC { namespace FTL {
39
keith_miller@apple.com504d5852017-09-13 01:31:07 +000040JITFinalizer::JITFinalizer(DFG::Plan& plan)
oliver@apple.com90fce822013-07-25 04:00:13 +000041 : Finalizer(plan)
42{
43}
44
45JITFinalizer::~JITFinalizer()
46{
oliver@apple.com90fce822013-07-25 04:00:13 +000047}
48
msaboff@apple.com95894332014-01-29 19:18:54 +000049size_t JITFinalizer::codeSize()
50{
51 size_t result = 0;
fpizlo@apple.comf74e4ae2015-11-18 23:05:34 +000052
fpizlo@apple.comf74e4ae2015-11-18 23:05:34 +000053 if (b3CodeLinkBuffer)
54 result += b3CodeLinkBuffer->size();
fpizlo@apple.comf74e4ae2015-11-18 23:05:34 +000055
56 if (entrypointLinkBuffer)
57 result += entrypointLinkBuffer->size();
msaboff@apple.com95894332014-01-29 19:18:54 +000058
59 return result;
60}
61
fpizlo@apple.com62b6af82013-08-29 18:25:36 +000062bool JITFinalizer::finalize()
oliver@apple.com90fce822013-07-25 04:00:13 +000063{
fpizlo@apple.com080f5282017-03-16 21:19:23 +000064 return finalizeCommon();
oliver@apple.com90fce822013-07-25 04:00:13 +000065}
66
fpizlo@apple.com62b6af82013-08-29 18:25:36 +000067bool JITFinalizer::finalizeFunction()
oliver@apple.com90fce822013-07-25 04:00:13 +000068{
fpizlo@apple.com080f5282017-03-16 21:19:23 +000069 return finalizeCommon();
70}
71
72bool JITFinalizer::finalizeCommon()
73{
fpizlo@apple.combce60f82015-11-19 20:03:22 +000074 bool dumpDisassembly = shouldDumpDisassembly() || Options::asyncDisassembly();
75
mark.lam@apple.comde0dba72018-04-18 03:31:09 +000076 MacroAssemblerCodeRef<JSEntryPtrTag> b3CodeRef =
77 FINALIZE_CODE_IF(dumpDisassembly, *b3CodeLinkBuffer, JSEntryPtrTag,
mark.lam@apple.com67f35bf2018-07-24 23:14:12 +000078 "FTL B3 code for %s", toCString(CodeBlockWithJITType(m_plan.codeBlock(), JITCode::FTLJIT)).data());
fpizlo@apple.comf74e4ae2015-11-18 23:05:34 +000079
mark.lam@apple.comde0dba72018-04-18 03:31:09 +000080 MacroAssemblerCodeRef<JSEntryPtrTag> arityCheckCodeRef = entrypointLinkBuffer
81 ? FINALIZE_CODE_IF(dumpDisassembly, *entrypointLinkBuffer, JSEntryPtrTag,
mark.lam@apple.com67f35bf2018-07-24 23:14:12 +000082 "FTL entrypoint thunk for %s with B3 generated code at %p", toCString(CodeBlockWithJITType(m_plan.codeBlock(), JITCode::FTLJIT)).data(), function)
mark.lam@apple.comde0dba72018-04-18 03:31:09 +000083 : MacroAssemblerCodeRef<JSEntryPtrTag>::createSelfManagedCodeRef(b3CodeRef.code());
mark.lam@apple.com18b4eab2018-03-31 07:04:00 +000084
85 jitCode->initializeB3Code(b3CodeRef);
86 jitCode->initializeArityCheckEntrypoint(arityCheckCodeRef);
87
mark.lam@apple.com67f35bf2018-07-24 23:14:12 +000088 m_plan.codeBlock()->setJITCode(*jitCode);
msaboff@apple.com4b8faa12014-02-12 18:40:35 +000089
mark.lam@apple.com67f35bf2018-07-24 23:14:12 +000090 if (UNLIKELY(m_plan.compilation()))
91 m_plan.vm()->m_perBytecodeProfiler->addCompilation(m_plan.codeBlock(), *m_plan.compilation());
92
oliver@apple.com90fce822013-07-25 04:00:13 +000093 return true;
94}
95
96} } // namespace JSC::FTL
97
98#endif // ENABLE(FTL_JIT)
99