We should have a Wasm callee
[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 "WasmOps.h"
35 #include <wtf/Vector.h>
36
37 namespace JSC {
38
39 class JSFunction;
40
41 namespace Wasm {
42
43 inline bool isValueType(Type type)
44 {
45     switch (type) {
46     case I32:
47     case I64:
48     case F32:
49     case F64:
50         return true;
51     default:
52         break;
53     }
54     return false;
55 }
56     
57 struct External {
58     enum Kind : uint8_t {
59         // FIXME auto-generate this. https://bugs.webkit.org/show_bug.cgi?id=165231
60         Function = 0,
61         Table = 1,
62         Memory = 2,
63         Global = 3,
64     };
65     template<typename Int>
66     static bool isValid(Int val)
67     {
68         switch (val) {
69         case Function:
70         case Table:
71         case Memory:
72         case Global:
73             return true;
74         default:
75             return false;
76         }
77     }
78     
79     static_assert(Function == 0, "Wasm needs Function to have the value 0");
80     static_assert(Table    == 1, "Wasm needs Table to have the value 1");
81     static_assert(Memory   == 2, "Wasm needs Memory to have the value 2");
82     static_assert(Global   == 3, "Wasm needs Global to have the value 3");
83 };
84
85 struct Signature {
86     Type returnType;
87     Vector<Type> arguments;
88 };
89     
90 struct Import {
91     Identifier module;
92     Identifier field;
93     External::Kind kind;
94     union {
95         Signature* functionSignature;
96         // FIXME implement Table https://bugs.webkit.org/show_bug.cgi?id=164135
97         // FIXME implement Memory https://bugs.webkit.org/show_bug.cgi?id=164134
98         // FIXME implement Global https://bugs.webkit.org/show_bug.cgi?id=164133
99     };
100 };
101
102 struct FunctionInformation {
103     Signature* signature;
104     size_t start;
105     size_t end;
106 };
107
108 class Memory;
109
110 struct Export {
111     Identifier field;
112     External::Kind kind;
113     union {
114         uint32_t functionIndex;
115         // FIXME implement Table https://bugs.webkit.org/show_bug.cgi?id=164135
116         // FIXME implement Memory https://bugs.webkit.org/show_bug.cgi?id=164134
117         // FIXME implement Global https://bugs.webkit.org/show_bug.cgi?id=164133
118     };
119 };
120
121 struct ModuleInformation {
122     Vector<Signature> signatures;
123     Vector<Import> imports;
124     Vector<FunctionInformation> functions;
125     std::unique_ptr<Memory> memory;
126     Vector<Export> exports;
127
128     ~ModuleInformation();
129 };
130
131 struct UnlinkedCall {
132     CodeLocationCall callLocation;
133     size_t functionIndex;
134 };
135
136 struct FunctionCompilation {
137     Vector<UnlinkedCall> unlinkedCalls;
138     CodeLocationDataLabelPtr calleeMoveLocation;
139     std::unique_ptr<B3::Compilation> code;
140     std::unique_ptr<B3::Compilation> jsEntryPoint;
141 };
142
143 typedef Vector<std::unique_ptr<FunctionCompilation>> CompiledFunctions;
144
145 } } // namespace JSC::Wasm
146
147 #endif // ENABLE(WEBASSEMBLY)