WebAssembly JS API: implement start function
[WebKit-https.git] / Source / JavaScriptCore / wasm / WasmFormat.h
1 /*
2  * Copyright (C) 2015 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 "B3Compilation.h"
31 #include "B3Type.h"
32 #include "CodeLocation.h"
33 #include "Identifier.h"
34 #include "MacroAssemblerCodeRef.h"
35 #include "WasmMemoryInformation.h"
36 #include "WasmOps.h"
37 #include "WasmPageCount.h"
38 #include <wtf/Optional.h>
39 #include <wtf/Vector.h>
40
41 namespace JSC {
42
43 class JSFunction;
44
45 namespace Wasm {
46
47 inline bool isValueType(Type type)
48 {
49     switch (type) {
50     case I32:
51     case I64:
52     case F32:
53     case F64:
54         return true;
55     default:
56         break;
57     }
58     return false;
59 }
60     
61 struct External {
62     enum Kind : uint8_t {
63         // FIXME auto-generate this. https://bugs.webkit.org/show_bug.cgi?id=165231
64         Function = 0,
65         Table = 1,
66         Memory = 2,
67         Global = 3,
68     };
69     template<typename Int>
70     static bool isValid(Int val)
71     {
72         switch (val) {
73         case Function:
74         case Table:
75         case Memory:
76         case Global:
77             return true;
78         default:
79             return false;
80         }
81     }
82     
83     static_assert(Function == 0, "Wasm needs Function to have the value 0");
84     static_assert(Table    == 1, "Wasm needs Table to have the value 1");
85     static_assert(Memory   == 2, "Wasm needs Memory to have the value 2");
86     static_assert(Global   == 3, "Wasm needs Global to have the value 3");
87 };
88
89 struct Signature {
90     Type returnType;
91     Vector<Type> arguments;
92 };
93     
94 struct Import {
95     Identifier module;
96     Identifier field;
97     External::Kind kind;
98     unsigned kindIndex; // Index in the vector of the corresponding kind.
99 };
100
101 struct Export {
102     Identifier field;
103     External::Kind kind;
104     union {
105         uint32_t functionIndex;
106         // FIXME implement Table https://bugs.webkit.org/show_bug.cgi?id=164135
107         // FIXME implement Memory https://bugs.webkit.org/show_bug.cgi?id=165671
108         // FIXME implement Global https://bugs.webkit.org/show_bug.cgi?id=164133
109     };
110 };
111
112 struct FunctionLocationInBinary {
113     size_t start;
114     size_t end;
115 };
116
117
118 struct ModuleInformation {
119     Vector<Signature> signatures;
120     Vector<Import> imports;
121     Vector<Signature*> importFunctions;
122     // FIXME implement import Table https://bugs.webkit.org/show_bug.cgi?id=164135
123     // FIXME implement import Global https://bugs.webkit.org/show_bug.cgi?id=164133
124     Vector<Signature*> internalFunctionSignatures;
125     MemoryInformation memory;
126     Vector<Export> exports;
127     std::optional<uint32_t> startFunctionIndexSpace;
128
129     ~ModuleInformation();
130 };
131
132 struct UnlinkedWasmToWasmCall {
133     CodeLocationCall callLocation;
134     size_t functionIndex;
135 };
136
137 struct WasmInternalFunction {
138     CodeLocationDataLabelPtr calleeMoveLocation;
139     std::unique_ptr<B3::Compilation> code;
140     std::unique_ptr<B3::Compilation> jsToWasmEntryPoint;
141 };
142
143 typedef MacroAssemblerCodeRef WasmToJSStub;
144
145 // WebAssembly direct calls and call_indirect use indices into "function index space". This space starts with all imports, and then all internal functions.
146 // CallableFunction and FunctionIndexSpace are only meant as fast lookup tables for these opcodes, and do not own code.
147 struct CallableFunction {
148     CallableFunction(Signature* signature)
149         : signature(signature)
150         , code(nullptr)
151     {
152     }
153     Signature* signature; // FIXME pack this inside a (uniqued) integer (for correctness the parser should unique Signatures), and then pack that integer into the code pointer. https://bugs.webkit.org/show_bug.cgi?id=165511
154     void* code;
155 };
156 typedef Vector<CallableFunction> FunctionIndexSpace;
157
158 } } // namespace JSC::Wasm
159
160 #endif // ENABLE(WEBASSEMBLY)