Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1485)

Unified Diff: src/wasm/wasm-objects.h

Issue 2784453002: [wasm] Fix serialization after instantiation (Closed)
Patch Set: feedback Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/wasm/wasm-module.cc ('k') | src/wasm/wasm-objects.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/wasm/wasm-objects.h
diff --git a/src/wasm/wasm-objects.h b/src/wasm/wasm-objects.h
index b35f754d4a95718931a4827a5cb087d463770bde..09eef82a26cae13997fa15d95766c614c46e0c5b 100644
--- a/src/wasm/wasm-objects.h
+++ b/src/wasm/wasm-objects.h
@@ -221,6 +221,30 @@ class WasmSharedModuleData : public FixedArray {
friend class WasmCompiledModule;
};
+// This represents the set of wasm compiled functions, together
+// with all the information necessary for re-specializing them.
+//
+// We specialize wasm functions to their instance by embedding:
+// - raw interior pointers into the backing store of the array buffer
+// used as memory of a particular WebAssembly.Instance object.
+// - bounds check limits, computed at compile time, relative to the
+// size of the memory.
+// - the objects representing the function tables and signature tables
+// - raw pointer to the globals buffer.
+//
+// Even without instantiating, we need values for all of these parameters.
+// We need to track these values to be able to create new instances and
+// to be able to serialize/deserialize.
+// The design decisions for how we track these values is not too immediate,
+// and it deserves a summary. The "tricky" ones are: memory, globals, and
+// the tables (signature and functions).
+// The first 2 (memory & globals) are embedded as raw pointers to native
+// buffers. All we need to track them is the start addresses and, in the
+// case of memory, the size. We model all of them as HeapNumbers, because
+// we need to store size_t values (for addresses), and potentially full
+// 32 bit unsigned values for the size. Smis are 31 bits.
+// For tables, we need to hold a reference to the JS Heap object, because
+// we embed them as objects, and they may move.
class WasmCompiledModule : public FixedArray {
public:
enum Fields { kFieldCount };
@@ -267,12 +291,19 @@ class WasmCompiledModule : public FixedArray {
#define WCM_WASM_OBJECT(TYPE, NAME) \
WCM_OBJECT_OR_WEAK(TYPE, NAME, kID_##NAME, TYPE::Is##TYPE(obj))
-#define WCM_SMALL_NUMBER(TYPE, NAME) \
+#define WCM_SMALL_FIXED_NUMBER(TYPE, NAME) \
TYPE NAME() const { \
return static_cast<TYPE>(Smi::cast(get(kID_##NAME))->value()); \
} \
void set_##NAME(TYPE value) { set(kID_##NAME, Smi::FromInt(value)); }
+#define WCM_SMALL_NUMBER(TYPE, NAME) \
+ TYPE NAME() const { \
+ return static_cast<TYPE>(Smi::cast(get(kID_##NAME))->value()); \
+ } \
+ void set_##NAME(TYPE value) { set(kID_##NAME, Smi::FromInt(value)); } \
+ bool has_##NAME() const { return get(kID_##NAME)->IsSmi(); }
+
#define WCM_WEAK_LINK(TYPE, NAME) \
WCM_OBJECT_OR_WEAK(WeakCell, weak_##NAME, kID_##NAME, obj->IsWeakCell()); \
\
@@ -280,21 +311,44 @@ class WasmCompiledModule : public FixedArray {
return handle(TYPE::cast(weak_##NAME()->value())); \
}
-#define CORE_WCM_PROPERTY_TABLE(MACRO) \
- MACRO(WASM_OBJECT, WasmSharedModuleData, shared) \
- MACRO(OBJECT, Context, native_context) \
- MACRO(SMALL_NUMBER, uint32_t, num_imported_functions) \
- MACRO(OBJECT, FixedArray, code_table) \
- MACRO(OBJECT, FixedArray, weak_exported_functions) \
- MACRO(OBJECT, FixedArray, function_tables) \
- MACRO(OBJECT, FixedArray, signature_tables) \
- MACRO(OBJECT, FixedArray, empty_function_tables) \
- MACRO(OBJECT, JSArrayBuffer, memory) \
- MACRO(SMALL_NUMBER, uint32_t, min_mem_pages) \
- MACRO(SMALL_NUMBER, uint32_t, max_mem_pages) \
- MACRO(WEAK_LINK, WasmCompiledModule, next_instance) \
- MACRO(WEAK_LINK, WasmCompiledModule, prev_instance) \
- MACRO(WEAK_LINK, JSObject, owning_instance) \
+#define WCM_LARGE_NUMBER(TYPE, NAME) \
+ TYPE NAME() const { \
+ Object* value = get(kID_##NAME); \
+ DCHECK(value->IsMutableHeapNumber()); \
+ return static_cast<TYPE>(HeapNumber::cast(value)->value()); \
+ } \
+ \
+ void set_##NAME(TYPE value) { \
+ Object* number = get(kID_##NAME); \
+ DCHECK(number->IsMutableHeapNumber()); \
+ HeapNumber::cast(number)->set_value(static_cast<double>(value)); \
+ } \
+ \
+ static void recreate_##NAME(Handle<WasmCompiledModule> obj, \
+ Factory* factory, TYPE init_val) { \
+ Handle<HeapNumber> number = factory->NewHeapNumber( \
+ static_cast<double>(init_val), MutableMode::MUTABLE, TENURED); \
+ obj->set(kID_##NAME, *number); \
+ } \
+ bool has_##NAME() const { return get(kID_##NAME)->IsMutableHeapNumber(); }
+
+#define CORE_WCM_PROPERTY_TABLE(MACRO) \
+ MACRO(WASM_OBJECT, WasmSharedModuleData, shared) \
+ MACRO(OBJECT, Context, native_context) \
+ MACRO(SMALL_FIXED_NUMBER, uint32_t, num_imported_functions) \
+ MACRO(OBJECT, FixedArray, code_table) \
+ MACRO(OBJECT, FixedArray, weak_exported_functions) \
+ MACRO(OBJECT, FixedArray, function_tables) \
+ MACRO(OBJECT, FixedArray, signature_tables) \
+ MACRO(OBJECT, FixedArray, empty_function_tables) \
+ MACRO(LARGE_NUMBER, size_t, embedded_mem_start) \
+ MACRO(LARGE_NUMBER, size_t, globals_start) \
+ MACRO(LARGE_NUMBER, uint32_t, embedded_mem_size) \
+ MACRO(SMALL_FIXED_NUMBER, uint32_t, min_mem_pages) \
+ MACRO(SMALL_FIXED_NUMBER, uint32_t, max_mem_pages) \
+ MACRO(WEAK_LINK, WasmCompiledModule, next_instance) \
+ MACRO(WEAK_LINK, WasmCompiledModule, prev_instance) \
+ MACRO(WEAK_LINK, JSObject, owning_instance) \
MACRO(WEAK_LINK, WasmModuleObject, wasm_module)
#if DEBUG
@@ -320,20 +374,36 @@ class WasmCompiledModule : public FixedArray {
Handle<WasmSharedModuleData> shared);
static Handle<WasmCompiledModule> Clone(Isolate* isolate,
- Handle<WasmCompiledModule> module) {
- Handle<WasmCompiledModule> ret = Handle<WasmCompiledModule>::cast(
- isolate->factory()->CopyFixedArray(module));
- ret->InitId();
- ret->reset_weak_owning_instance();
- ret->reset_weak_next_instance();
- ret->reset_weak_prev_instance();
- ret->reset_weak_exported_functions();
- return ret;
+ Handle<WasmCompiledModule> module);
+ static void Reset(Isolate* isolate, WasmCompiledModule* module);
+
+ Address GetEmbeddedMemStartOrNull() const {
+ DisallowHeapAllocation no_gc;
+ if (has_embedded_mem_start()) {
+ return reinterpret_cast<Address>(embedded_mem_start());
+ }
+ return nullptr;
+ }
+
+ Address GetGlobalsStartOrNull() const {
+ DisallowHeapAllocation no_gc;
+ if (has_globals_start()) {
+ return reinterpret_cast<Address>(globals_start());
+ }
+ return nullptr;
}
uint32_t mem_size() const;
uint32_t default_mem_size() const;
+ void ResetSpecializationMemInfoIfNeeded();
+ static void SetSpecializationMemInfoFrom(
+ Factory* factory, Handle<WasmCompiledModule> compiled_module,
+ Handle<JSArrayBuffer> buffer);
+ static void SetGlobalsStartAddressFrom(
+ Factory* factory, Handle<WasmCompiledModule> compiled_module,
+ Handle<JSArrayBuffer> buffer);
+
#define DECLARATION(KIND, TYPE, NAME) WCM_##KIND(TYPE, NAME)
WCM_PROPERTY_TABLE(DECLARATION)
#undef DECLARATION
« no previous file with comments | « src/wasm/wasm-module.cc ('k') | src/wasm/wasm-objects.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698