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