1/*
2 * Copyright (C) 2013 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 "FTLJITCode.h"
28
29#if ENABLE(FTL_JIT)
30
31namespace JSC { namespace FTL {
32
33JITCode::JITCode()
34    : JSC::JITCode(FTLJIT)
35{
36}
37
38JITCode::~JITCode()
39{
40}
41
42void JITCode::initializeExitThunks(CodeRef exitThunks)
43{
44    m_exitThunks = exitThunks;
45}
46
47void JITCode::addHandle(PassRefPtr<ExecutableMemoryHandle> handle)
48{
49    m_handles.append(handle);
50}
51
52void JITCode::addDataSection(PassRefPtr<DataSection> dataSection)
53{
54    m_dataSections.append(dataSection);
55}
56
57void JITCode::initializeArityCheckEntrypoint(CodeRef entrypoint)
58{
59    m_arityCheckEntrypoint = entrypoint;
60}
61
62void JITCode::initializeAddressForCall(CodePtr address)
63{
64    m_addressForCall = address;
65}
66
67JITCode::CodePtr JITCode::addressForCall(VM&, ExecutableBase*, ArityCheckMode arityCheck, RegisterPreservationMode)
68{
69    switch (arityCheck) {
70    case ArityCheckNotRequired:
71        return m_addressForCall;
72    case MustCheckArity:
73        return m_arityCheckEntrypoint.code();
74    }
75    RELEASE_ASSERT_NOT_REACHED();
76    return CodePtr();
77}
78
79void* JITCode::executableAddressAtOffset(size_t offset)
80{
81    return reinterpret_cast<char*>(m_addressForCall.executableAddress()) + offset;
82}
83
84void* JITCode::dataAddressAtOffset(size_t)
85{
86    // We can't patch FTL code, yet. Even if we did, it's not clear that we would do so
87    // through this API.
88    RELEASE_ASSERT_NOT_REACHED();
89    return 0;
90}
91
92unsigned JITCode::offsetOf(void*)
93{
94    // We currently don't have visibility into the FTL code.
95    RELEASE_ASSERT_NOT_REACHED();
96    return 0;
97}
98
99size_t JITCode::size()
100{
101    // We don't know the size of FTL code, yet. Make a wild guess. This is mostly used for
102    // GC load estimates.
103    return 1000;
104}
105
106bool JITCode::contains(void*)
107{
108    // We have no idea what addresses the FTL code contains, yet.
109    RELEASE_ASSERT_NOT_REACHED();
110    return false;
111}
112
113JITCode::CodePtr JITCode::exitThunks()
114{
115    return m_exitThunks.code();
116}
117
118JITCode* JITCode::ftl()
119{
120    return this;
121}
122
123DFG::CommonData* JITCode::dfgCommon()
124{
125    return &common;
126}
127
128} } // namespace JSC::FTL
129
130#endif // ENABLE(FTL_JIT)
131
132