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

Unified Diff: src/wasm/wasm-module.cc

Issue 2390393002: [wasm] tracing for wasm module instances (Closed)
Patch Set: [wasm] tracing for wasm module instances Created 4 years, 2 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.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/wasm/wasm-module.cc
diff --git a/src/wasm/wasm-module.cc b/src/wasm/wasm-module.cc
index a2c8ec6b1d666f72d243a19983957cd7626ac4d7..4f8ba5d5d8d7557273e1a3cc1f9ac64e2d8b7d01 100644
--- a/src/wasm/wasm-module.cc
+++ b/src/wasm/wasm-module.cc
@@ -28,6 +28,16 @@ namespace v8 {
namespace internal {
namespace wasm {
+#define TRACE(...) \
+ do { \
+ if (FLAG_trace_wasm_instances) PrintF(__VA_ARGS__); \
+ } while (false)
+
+#define TRACE_CHAIN(instance) \
+ do { \
+ instance->PrintInstancesChain(); \
+ } while (false)
+
namespace {
static const int kPlaceholderMarker = 1000000000;
@@ -728,6 +738,7 @@ void PatchDirectCalls(Handle<FixedArray> old_functions,
static void ResetCompiledModule(Isolate* isolate, JSObject* owner,
WasmCompiledModule* compiled_module) {
+ TRACE("Resetting %d\n", compiled_module->instance_id());
Object* undefined = *isolate->factory()->undefined_value();
uint32_t old_mem_size = compiled_module->has_heap()
? compiled_module->mem_size()
@@ -781,6 +792,7 @@ static void InstanceFinalizer(const v8::WeakCallbackInfo<void>& data) {
JSObject* owner = *p;
WasmCompiledModule* compiled_module =
WasmCompiledModule::cast(owner->GetInternalField(kWasmCompiledModule));
+ TRACE("Finalizing %d {\n", compiled_module->instance_id());
Isolate* isolate = reinterpret_cast<Isolate*>(data.GetIsolate());
DCHECK(compiled_module->has_weak_module_object());
WeakCell* weak_module_obj = compiled_module->ptr_to_weak_module_object();
@@ -792,6 +804,11 @@ static void InstanceFinalizer(const v8::WeakCallbackInfo<void>& data) {
JSObject* module_obj = JSObject::cast(weak_module_obj->value());
WasmCompiledModule* current_template =
WasmCompiledModule::cast(module_obj->GetInternalField(0));
+
+ TRACE("chain before {\n");
+ TRACE_CHAIN(current_template);
+ TRACE("}\n");
+
DCHECK(!current_template->has_weak_prev_instance());
WeakCell* next = compiled_module->ptr_to_weak_next_instance();
WeakCell* prev = compiled_module->ptr_to_weak_prev_instance();
@@ -829,9 +846,13 @@ static void InstanceFinalizer(const v8::WeakCallbackInfo<void>& data) {
}
}
}
+ TRACE("chain after {\n");
+ TRACE_CHAIN(WasmCompiledModule::cast(module_obj->GetInternalField(0)));
+ TRACE("}\n");
}
compiled_module->reset_weak_owning_instance();
GlobalHandles::Destroy(reinterpret_cast<Object**>(p));
+ TRACE("}\n");
}
Handle<FixedArray> SetupIndirectFunctionTable(
@@ -1186,6 +1207,7 @@ MaybeHandle<JSObject> WasmModule::Instantiate(Isolate* isolate,
// this will be a cleared. We'll link the instances chain last.
MaybeHandle<WeakCell> link_to_original;
+ TRACE("Starting new module instantiation\n");
{
Handle<WasmCompiledModule> original(
WasmCompiledModule::cast(module_object->GetInternalField(0)), isolate);
@@ -1200,6 +1222,7 @@ MaybeHandle<JSObject> WasmModule::Instantiate(Isolate* isolate,
// There is already an owner, clone everything.
owner = Handle<JSObject>(JSObject::cast(tmp->value()), isolate);
// Insert the latest clone in front.
+ TRACE("Cloning from %d\n", original->instance_id());
compiled_module = WasmCompiledModule::Clone(isolate, original);
// Replace the strong reference to point to the new instance here.
// This allows any of the other instances, including the original,
@@ -1233,6 +1256,7 @@ MaybeHandle<JSObject> WasmModule::Instantiate(Isolate* isolate,
} else {
// There was no owner, so we can reuse the original.
compiled_module = original;
+ TRACE("Reusing existing instance %d\n", compiled_module->instance_id());
}
compiled_module->set_code_table(code_table);
}
@@ -1490,8 +1514,7 @@ MaybeHandle<JSObject> WasmModule::Instantiate(Isolate* isolate,
DCHECK(wasm::IsWasmObject(*instance));
- if (compiled_module->has_weak_module_object()) {
- instance->SetInternalField(kWasmCompiledModule, *compiled_module);
+ {
Handle<WeakCell> link_to_owner = factory->NewWeakCell(instance);
Handle<Object> global_handle = isolate->global_handles()->Create(*instance);
@@ -1507,15 +1530,23 @@ MaybeHandle<JSObject> WasmModule::Instantiate(Isolate* isolate,
compiled_module->set_weak_next_instance(next);
original->set_weak_prev_instance(link_to_clone);
}
+
+ compiled_module->set_weak_owning_instance(link_to_owner);
+ instance->SetInternalField(kWasmCompiledModule, *compiled_module);
GlobalHandles::MakeWeak(global_handle.location(),
global_handle.location(), &InstanceFinalizer,
v8::WeakCallbackType::kFinalizer);
}
}
-
+ TRACE("Finishing instance %d\n", compiled_module->instance_id());
+ TRACE_CHAIN(WasmCompiledModule::cast(module_object->GetInternalField(0)));
return instance;
}
+#if DEBUG
+uint32_t WasmCompiledModule::instance_id_counter_ = 0;
+#endif
+
Handle<WasmCompiledModule> WasmCompiledModule::New(Isolate* isolate,
uint32_t min_memory_pages,
uint32_t globals_size,
@@ -1533,9 +1564,31 @@ Handle<WasmCompiledModule> WasmCompiledModule::New(Isolate* isolate,
ret->set(kID_globals_size, Smi::FromInt(static_cast<int>(globals_size)));
ret->set(kID_export_memory, Smi::FromInt(static_cast<int>(export_memory)));
ret->set(kID_origin, Smi::FromInt(static_cast<int>(origin)));
+ WasmCompiledModule::cast(*ret)->Init();
return handle(WasmCompiledModule::cast(*ret));
}
+void WasmCompiledModule::Init() {
+#if DEBUG
+ set(kID_instance_id, Smi::FromInt(instance_id_counter_++));
+ TRACE("New compiled module id: %d\n", instance_id());
+#endif
+}
+
+void WasmCompiledModule::PrintInstancesChain() {
+#if DEBUG
+ if (!FLAG_trace_wasm_instances) return;
+ for (WasmCompiledModule* current = this; current != nullptr;) {
+ PrintF("->%d", current->instance_id());
+ if (current->ptr_to_weak_next_instance() == nullptr) break;
+ CHECK(!current->ptr_to_weak_next_instance()->cleared());
+ current =
+ WasmCompiledModule::cast(current->ptr_to_weak_next_instance()->value());
+ }
+ PrintF("\n");
+#endif
+}
+
Handle<Object> GetWasmFunctionNameOrNull(Isolate* isolate, Handle<Object> wasm,
uint32_t func_index) {
if (!wasm->IsUndefined(isolate)) {
« no previous file with comments | « src/wasm/wasm-module.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698