Wasm should support call_indirect
[WebKit-https.git] / Source / JavaScriptCore / wasm / WasmPlan.h
1 /*
2  * Copyright (C) 2016 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 #pragma once
27
28 #if ENABLE(WEBASSEMBLY)
29
30 #include "CompilationResult.h"
31 #include "VM.h"
32 #include "WasmFormat.h"
33 #include <wtf/Bag.h>
34 #include <wtf/ThreadSafeRefCounted.h>
35 #include <wtf/Vector.h>
36
37 namespace JSC {
38
39 class CallLinkInfo;
40 class JSGlobalObject;
41 class JSWebAssemblyCallee;
42
43 namespace Wasm {
44
45 class Plan {
46 public:
47     JS_EXPORT_PRIVATE Plan(VM*, Vector<uint8_t>);
48     JS_EXPORT_PRIVATE Plan(VM*, const uint8_t*, size_t);
49     JS_EXPORT_PRIVATE ~Plan();
50
51     JS_EXPORT_PRIVATE void run();
52
53     JS_EXPORT_PRIVATE void initializeCallees(JSGlobalObject*, std::function<void(unsigned, JSWebAssemblyCallee*)>);
54
55     bool WARN_UNUSED_RETURN failed() const { return m_failed; }
56     const String& errorMessage() const
57     {
58         RELEASE_ASSERT(failed());
59         return m_errorMessage;
60     }
61
62     Vector<Export>& exports() const
63     {
64         RELEASE_ASSERT(!failed());
65         return m_moduleInformation->exports;
66     }
67
68     size_t internalFunctionCount() const
69     {
70         RELEASE_ASSERT(!failed());
71         return m_wasmInternalFunctions.size();
72     }
73
74     B3::Compilation* jsToWasmEntryPointForFunction(size_t i) const
75     {
76         ASSERT(i > m_wasmToJSStubs.size());
77         return m_wasmInternalFunctions.at(i - m_wasmToJSStubs.size())->jsToWasmEntryPoint.get();
78     }
79
80     std::unique_ptr<ModuleInformation>&& takeModuleInformation()
81     {
82         RELEASE_ASSERT(!failed());
83         return WTFMove(m_moduleInformation);
84     }
85
86     Bag<CallLinkInfo>&& takeCallLinkInfos()
87     {
88         RELEASE_ASSERT(!failed());
89         return WTFMove(m_callLinkInfos);
90     }
91
92     Vector<WasmToJSStub>&& takeWasmToJSStubs()
93     {
94         RELEASE_ASSERT(!failed());
95         return WTFMove(m_wasmToJSStubs);
96     }
97
98     ImmutableFunctionIndexSpace&& takeFunctionIndexSpace()
99     {
100         RELEASE_ASSERT(!failed());
101         return WTFMove(m_functionIndexSpace);
102     }
103
104 private:
105     std::unique_ptr<ModuleInformation> m_moduleInformation;
106     Vector<FunctionLocationInBinary> m_functionLocationInBinary;
107     Bag<CallLinkInfo> m_callLinkInfos;
108     Vector<WasmToJSStub> m_wasmToJSStubs;
109     Vector<std::unique_ptr<WasmInternalFunction>> m_wasmInternalFunctions;
110     ImmutableFunctionIndexSpace m_functionIndexSpace;
111
112     VM* m_vm;
113     const uint8_t* m_source;
114     const size_t m_sourceLength;
115     bool m_failed { true };
116     String m_errorMessage;
117 };
118
119 } } // namespace JSC::Wasm
120
121 #endif // ENABLE(WEBASSEMBLY)