summaryrefslogtreecommitdiffstats
path: root/js/src/wasm/WasmInstanceData.h
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/wasm/WasmInstanceData.h')
-rw-r--r--js/src/wasm/WasmInstanceData.h187
1 files changed, 187 insertions, 0 deletions
diff --git a/js/src/wasm/WasmInstanceData.h b/js/src/wasm/WasmInstanceData.h
new file mode 100644
index 0000000000..98aa097dee
--- /dev/null
+++ b/js/src/wasm/WasmInstanceData.h
@@ -0,0 +1,187 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ * vim: set ts=8 sts=2 et sw=2 tw=80:
+ *
+ * Copyright 2021 Mozilla Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef wasm_instance_data_h
+#define wasm_instance_data_h
+
+#include <stdint.h>
+
+#include "NamespaceImports.h"
+
+#include "gc/Pretenuring.h"
+#include "js/Utility.h"
+#include "wasm/WasmInstance.h"
+#include "wasm/WasmMemory.h"
+#include "wasm/WasmTypeDecls.h"
+
+namespace js {
+namespace wasm {
+
+// ExportArg holds the unboxed operands to the wasm entry trampoline which can
+// be called through an ExportFuncPtr.
+
+struct ExportArg {
+ uint64_t lo;
+ uint64_t hi;
+};
+
+using ExportFuncPtr = int32_t (*)(ExportArg*, Instance*);
+
+// TypeDefInstanceData describes the runtime information associated with a
+// module's type definition. This is accessed directly from JIT code and the
+// Instance.
+
+struct TypeDefInstanceData {
+ TypeDefInstanceData()
+ : typeDef(nullptr),
+ superTypeVector(nullptr),
+ shape(nullptr),
+ clasp(nullptr),
+ allocKind(gc::AllocKind::LIMIT),
+ unused(0) {}
+
+ // The canonicalized pointer to this type definition. This is kept alive by
+ // the type context associated with the instance.
+ const wasm::TypeDef* typeDef;
+
+ // The supertype vector for this type definition. This is also kept alive
+ // by the type context associated with the instance.
+ //
+ const wasm::SuperTypeVector* superTypeVector;
+
+ // The next four fields are only meaningful for, and used by, structs and
+ // arrays.
+ GCPtr<Shape*> shape;
+ const JSClass* clasp;
+ // The allocation site for GC types. This is used for pre-tenuring.
+ alignas(8) gc::AllocSite allocSite;
+ // Only valid for structs.
+ gc::AllocKind allocKind;
+
+ // This union is only meaningful for structs and arrays, and should
+ // otherwise be set to zero:
+ //
+ // * if `typeDef` refers to a struct type, then it caches the value of
+ // `typeDef->structType().size_` (a size in bytes)
+ //
+ // * if `typeDef` refers to an array type, then it caches the value of
+ // `typeDef->arrayType().elementType_.size()` (also a size in bytes)
+ //
+ // This is so that allocators of structs and arrays don't need to chase from
+ // this TypeDefInstanceData through `typeDef` to find the value.
+ union {
+ uint32_t structTypeSize;
+ uint32_t arrayElemSize;
+ uint32_t unused;
+ };
+
+ static constexpr size_t offsetOfShape() {
+ return offsetof(TypeDefInstanceData, shape);
+ }
+ static constexpr size_t offsetOfSuperTypeVector() {
+ return offsetof(TypeDefInstanceData, superTypeVector);
+ }
+ static constexpr size_t offsetOfAllocSite() {
+ return offsetof(TypeDefInstanceData, allocSite);
+ }
+ static constexpr size_t offsetOfArrayElemSize() {
+ return offsetof(TypeDefInstanceData, arrayElemSize);
+ }
+};
+
+// FuncImportInstanceData describes the region of wasm global memory allocated
+// in the instance's thread-local storage for a function import. This is
+// accessed directly from JIT code and mutated by Instance as exits become
+// optimized and deoptimized.
+
+struct FuncImportInstanceData {
+ // The code to call at an import site: a wasm callee, a thunk into C++, or a
+ // thunk into JIT code.
+ void* code;
+
+ // The callee's Instance pointer, which must be loaded to InstanceReg
+ // (along with any pinned registers) before calling 'code'.
+ Instance* instance;
+
+ // The callee function's realm.
+ JS::Realm* realm;
+
+ // A GC pointer which keeps the callee alive and is used to recover import
+ // values for lazy table initialization.
+ GCPtr<JSObject*> callable;
+ static_assert(sizeof(GCPtr<JSObject*>) == sizeof(void*), "for JIT access");
+};
+
+struct MemoryInstanceData {
+ // Pointer the memory object.
+ GCPtr<WasmMemoryObject*> memory;
+
+ // Pointer to the base of the memory.
+ uint8_t* base;
+
+ // Bounds check limit in bytes (or zero if there is no memory). This is
+ // 64-bits on 64-bit systems so as to allow for heap lengths up to and beyond
+ // 4GB, and 32-bits on 32-bit systems, where heaps are limited to 2GB.
+ //
+ // See "Linear memory addresses and bounds checking" in WasmMemory.cpp.
+ uintptr_t boundsCheckLimit;
+
+ // Whether this memory is shared or not.
+ bool isShared;
+};
+
+// TableInstanceData describes the region of wasm global memory allocated in the
+// instance's thread-local storage which is accessed directly from JIT code
+// to bounds-check and index the table.
+
+struct TableInstanceData {
+ // Length of the table in number of elements (not bytes).
+ uint32_t length;
+
+ // Pointer to the array of elements (which can have various representations).
+ // For tables of anyref this is null.
+ // For tables of functions, this is a pointer to the array of code pointers.
+ void* elements;
+};
+
+// TagInstanceData describes the instance state associated with a tag.
+
+struct TagInstanceData {
+ GCPtr<WasmTagObject*> object;
+};
+
+// Table element for TableRepr::Func which carries both the code pointer and
+// a instance pointer (and thus anything reachable through the instance).
+
+struct FunctionTableElem {
+ // The code to call when calling this element. The table ABI is the system
+ // ABI with the additional ABI requirements that:
+ // - InstanceReg and any pinned registers have been loaded appropriately
+ // - if this is a heterogeneous table that requires a signature check,
+ // WasmTableCallSigReg holds the signature id.
+ void* code;
+
+ // The pointer to the callee's instance's Instance. This must be loaded into
+ // InstanceReg before calling 'code'.
+ Instance* instance;
+};
+
+} // namespace wasm
+} // namespace js
+
+#endif // wasm_instance_data_h