WebAssembly JS API: implement more sections
[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 <wtf/Vector.h>
34 #include <wtf/text/WTFString.h>
35
36 namespace JSC {
37
38 class JSFunction;
39
40 namespace Wasm {
41
42 enum Type : uint8_t {
43     Void,
44     I32,
45     I64,
46     F32,
47     F64,
48     LastValueType = F64,
49 };
50
51 static_assert(I32 == 1, "Wasm needs I32 to have the value 1");
52 static_assert(I64 == 2, "Wasm needs I64 to have the value 2");
53 static_assert(F32 == 3, "Wasm needs F32 to have the value 3");
54 static_assert(F64 == 4, "Wasm needs F64 to have the value 4");
55
56 inline B3::Type toB3Type(Type type)
57 {
58     switch (type) {
59     case I32: return B3::Int32;
60     case I64: return B3::Int64;
61     case F32: return B3::Float;
62     case F64: return B3::Double;
63     case Void: return B3::Void;
64     default: break;
65     }
66     RELEASE_ASSERT_NOT_REACHED();
67 }
68
69 inline bool isValueType(Type type)
70 {
71     switch (type) {
72     case I32:
73     case I64:
74     case F32:
75     case F64:
76         return true;
77     default:
78         break;
79     }
80     return false;
81 }
82
83 const char* toString(Type);
84     
85 struct External {
86     enum Kind : uint8_t {
87         Function = 0,
88         Table = 1,
89         Memory = 2,
90         Global = 3,
91     };
92     template<typename Int>
93     static bool isValid(Int val)
94     {
95         switch (val) {
96         case Function:
97         case Table:
98         case Memory:
99         case Global:
100             return true;
101         default:
102             return false;
103         }
104     }
105     
106     static_assert(Function == 0, "Wasm needs Function to have the value 0");
107     static_assert(Table    == 1, "Wasm needs Table to have the value 1");
108     static_assert(Memory   == 2, "Wasm needs Memory to have the value 2");
109     static_assert(Global   == 3, "Wasm needs Global to have the value 3");
110 };
111
112 struct Signature {
113     Type returnType;
114     Vector<Type> arguments;
115 };
116     
117 struct Import {
118     String module;
119     String field;
120     External::Kind kind;
121     union {
122         Signature* functionSignature;
123         // FIXME implement Table https://bugs.webkit.org/show_bug.cgi?id=164135
124         // FIXME implement Memory https://bugs.webkit.org/show_bug.cgi?id=164134
125         // FIXME implement Global https://bugs.webkit.org/show_bug.cgi?id=164133
126     };
127 };
128
129 struct FunctionInformation {
130     Signature* signature;
131     size_t start;
132     size_t end;
133 };
134
135 class Memory;
136
137 struct Export {
138     String field;
139     External::Kind kind;
140     union {
141         Signature* functionSignature;
142         // FIXME implement Table https://bugs.webkit.org/show_bug.cgi?id=164135
143         // FIXME implement Memory https://bugs.webkit.org/show_bug.cgi?id=164134
144         // FIXME implement Global https://bugs.webkit.org/show_bug.cgi?id=164133
145     };
146 };
147
148 struct ModuleInformation {
149     Vector<Signature> signatures;
150     Vector<Import> imports;
151     Vector<FunctionInformation> functions;
152     std::unique_ptr<Memory> memory;
153     Vector<Export> exports;
154
155     ~ModuleInformation();
156 };
157
158 struct FunctionCompilation;
159 typedef Vector<std::unique_ptr<FunctionCompilation>> CompiledFunctions;
160
161 struct UnlinkedCall {
162     CodeLocationCall callLocation;
163     size_t functionIndex;
164 };
165
166 struct FunctionCompilation {
167     Vector<UnlinkedCall> unlinkedCalls;
168     std::unique_ptr<B3::Compilation> code;
169     std::unique_ptr<B3::Compilation> jsEntryPoint;
170 };
171
172 } } // namespace JSC::Wasm
173
174 #endif // ENABLE(WEBASSEMBLY)