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

Side by Side Diff: src/wasm/wasm-module.cc

Issue 2284683005: [wasm] Use weak reference for wasm deopt data. (Closed)
Patch Set: Created 4 years, 3 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 unified diff | Download patch
« no previous file with comments | « src/wasm/wasm-module.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <memory> 5 #include <memory>
6 6
7 #include "src/base/atomic-utils.h" 7 #include "src/base/atomic-utils.h"
8 #include "src/code-stubs.h" 8 #include "src/code-stubs.h"
9 9
10 #include "src/macro-assembler.h" 10 #include "src/macro-assembler.h"
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
137 // add another Internal Field as the function arity 137 // add another Internal Field as the function arity
138 function->SetInternalField(kInternalArity, Smi::FromInt(arity)); 138 function->SetInternalField(kInternalArity, Smi::FromInt(arity));
139 // add another Internal Field as the signature of the foreign function 139 // add another Internal Field as the signature of the foreign function
140 Handle<ByteArray> signature; 140 Handle<ByteArray> signature;
141 if (maybe_signature.ToHandle(&signature)) { 141 if (maybe_signature.ToHandle(&signature)) {
142 function->SetInternalField(kInternalSignature, *signature); 142 function->SetInternalField(kInternalSignature, *signature);
143 } 143 }
144 return function; 144 return function;
145 } 145 }
146 146
147 Object* GetOwningWasmInstance(Object* undefined, Code* code) {
bradnelson 2016/08/29 19:09:48 Why pass undefined in instead of the isolate?
Mircea Trofin 2016/08/29 19:12:22 Because undefined is the only needed value, rather
148 DCHECK(code->kind() == Code::WASM_FUNCTION);
149 DisallowHeapAllocation no_gc;
150 FixedArray* deopt_data = code->deoptimization_data();
151 DCHECK_NOT_NULL(deopt_data);
152 DCHECK(deopt_data->length() == 2);
153 Object* weak_link = deopt_data->get(0);
154 if (weak_link == undefined) return undefined;
155 WeakCell* cell = WeakCell::cast(weak_link);
156 return cell->value();
157 }
158
147 namespace { 159 namespace {
148 // Internal constants for the layout of the module object. 160 // Internal constants for the layout of the module object.
149 const int kWasmModuleFunctionTable = 0; 161 const int kWasmModuleFunctionTable = 0;
150 const int kWasmModuleCodeTable = 1; 162 const int kWasmModuleCodeTable = 1;
151 const int kWasmMemArrayBuffer = 2; 163 const int kWasmMemArrayBuffer = 2;
152 const int kWasmGlobalsArrayBuffer = 3; 164 const int kWasmGlobalsArrayBuffer = 3;
153 // TODO(clemensh): Remove function name array, extract names from module bytes. 165 // TODO(clemensh): Remove function name array, extract names from module bytes.
154 const int kWasmFunctionNamesArray = 4; 166 const int kWasmFunctionNamesArray = 4;
155 const int kWasmModuleBytesString = 5; 167 const int kWasmModuleBytesString = 5;
156 const int kWasmDebugInfo = 6; 168 const int kWasmDebugInfo = 6;
(...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after
427 } 439 }
428 440
429 void FlushAssemblyCache(Isolate* isolate, Handle<FixedArray> functions) { 441 void FlushAssemblyCache(Isolate* isolate, Handle<FixedArray> functions) {
430 for (int i = 0; i < functions->length(); ++i) { 442 for (int i = 0; i < functions->length(); ++i) {
431 Handle<Code> code = functions->GetValueChecked<Code>(isolate, i); 443 Handle<Code> code = functions->GetValueChecked<Code>(isolate, i);
432 Assembler::FlushICache(isolate, code->instruction_start(), 444 Assembler::FlushICache(isolate, code->instruction_start(),
433 code->instruction_size()); 445 code->instruction_size());
434 } 446 }
435 } 447 }
436 448
449 void SetRuntimeSupport(Isolate* isolate, Handle<JSObject> js_object) {
450 Handle<FixedArray> functions = Handle<FixedArray>(
451 FixedArray::cast(js_object->GetInternalField(kWasmModuleCodeTable)));
452 Handle<WeakCell> weak_link = isolate->factory()->NewWeakCell(js_object);
453
454 for (int i = FLAG_skip_compiling_wasm_funcs; i < functions->length(); ++i) {
455 Handle<Code> code = functions->GetValueChecked<Code>(isolate, i);
456 DCHECK(code->deoptimization_data() == nullptr ||
457 code->deoptimization_data()->length() == 0);
458 Handle<FixedArray> deopt_data =
459 isolate->factory()->NewFixedArray(2, TENURED);
460 deopt_data->set(0, *weak_link);
461 deopt_data->set(1, Smi::FromInt(static_cast<int>(i)));
462 deopt_data->set_length(2);
463 code->set_deoptimization_data(*deopt_data);
464 }
465 }
466
437 } // namespace 467 } // namespace
438 468
439 WasmModule::WasmModule(byte* module_start) 469 WasmModule::WasmModule(byte* module_start)
440 : module_start(module_start), 470 : module_start(module_start),
441 module_end(nullptr), 471 module_end(nullptr),
442 min_mem_pages(0), 472 min_mem_pages(0),
443 max_mem_pages(0), 473 max_mem_pages(0),
444 mem_export(false), 474 mem_export(false),
445 mem_external(false), 475 mem_external(false),
446 start_function_index(-1), 476 start_function_index(-1),
(...skipping 419 matching lines...) Expand 10 before | Expand all | Expand 10 after
866 896
867 void SetDebugSupport(Factory* factory, Handle<FixedArray> compiled_module, 897 void SetDebugSupport(Factory* factory, Handle<FixedArray> compiled_module,
868 Handle<JSObject> js_object) { 898 Handle<JSObject> js_object) {
869 Isolate* isolate = compiled_module->GetIsolate(); 899 Isolate* isolate = compiled_module->GetIsolate();
870 MaybeHandle<String> module_bytes_string = 900 MaybeHandle<String> module_bytes_string =
871 compiled_module->GetValue<String>(isolate, kModuleBytes); 901 compiled_module->GetValue<String>(isolate, kModuleBytes);
872 if (!module_bytes_string.is_null()) { 902 if (!module_bytes_string.is_null()) {
873 js_object->SetInternalField(kWasmModuleBytesString, 903 js_object->SetInternalField(kWasmModuleBytesString,
874 *module_bytes_string.ToHandleChecked()); 904 *module_bytes_string.ToHandleChecked());
875 } 905 }
876 Handle<FixedArray> functions = Handle<FixedArray>(
877 FixedArray::cast(js_object->GetInternalField(kWasmModuleCodeTable)));
878
879 for (int i = FLAG_skip_compiling_wasm_funcs; i < functions->length(); ++i) {
880 Handle<Code> code = functions->GetValueChecked<Code>(isolate, i);
881 DCHECK(code->deoptimization_data() == nullptr ||
882 code->deoptimization_data()->length() == 0);
883 Handle<FixedArray> deopt_data = factory->NewFixedArray(2, TENURED);
884 if (!js_object.is_null()) {
885 deopt_data->set(0, *js_object);
886 }
887 deopt_data->set(1, Smi::FromInt(static_cast<int>(i)));
888 deopt_data->set_length(2);
889 code->set_deoptimization_data(*deopt_data);
890 }
891 906
892 MaybeHandle<ByteArray> function_name_table = 907 MaybeHandle<ByteArray> function_name_table =
893 compiled_module->GetValue<ByteArray>(isolate, kFunctionNameTable); 908 compiled_module->GetValue<ByteArray>(isolate, kFunctionNameTable);
894 if (!function_name_table.is_null()) { 909 if (!function_name_table.is_null()) {
895 js_object->SetInternalField(kWasmFunctionNamesArray, 910 js_object->SetInternalField(kWasmFunctionNamesArray,
896 *function_name_table.ToHandleChecked()); 911 *function_name_table.ToHandleChecked());
897 } 912 }
898 } 913 }
899 914
900 bool SetupGlobals(Isolate* isolate, Handle<FixedArray> compiled_module, 915 bool SetupGlobals(Isolate* isolate, Handle<FixedArray> compiled_module,
(...skipping 489 matching lines...) Expand 10 before | Expand all | Expand 10 after
1390 1405
1391 if (!(SetupInstanceHeap(isolate, compiled_module, js_object, memory, 1406 if (!(SetupInstanceHeap(isolate, compiled_module, js_object, memory,
1392 &thrower) && 1407 &thrower) &&
1393 SetupGlobals(isolate, compiled_module, js_object, &thrower) && 1408 SetupGlobals(isolate, compiled_module, js_object, &thrower) &&
1394 SetupImports(isolate, compiled_module, js_object, &thrower, ffi) && 1409 SetupImports(isolate, compiled_module, js_object, &thrower, ffi) &&
1395 SetupExportsObject(compiled_module, isolate, js_object, &thrower))) { 1410 SetupExportsObject(compiled_module, isolate, js_object, &thrower))) {
1396 return nothing; 1411 return nothing;
1397 } 1412 }
1398 1413
1399 SetDebugSupport(factory, compiled_module, js_object); 1414 SetDebugSupport(factory, compiled_module, js_object);
1415 SetRuntimeSupport(isolate, js_object);
1400 1416
1401 FlushAssemblyCache(isolate, code_table); 1417 FlushAssemblyCache(isolate, code_table);
1402 1418
1403 MaybeHandle<FixedArray> maybe_indirect_tables = 1419 MaybeHandle<FixedArray> maybe_indirect_tables =
1404 compiled_module->GetValue<FixedArray>(isolate, 1420 compiled_module->GetValue<FixedArray>(isolate,
1405 kTableOfIndirectFunctionTables); 1421 kTableOfIndirectFunctionTables);
1406 Handle<FixedArray> indirect_tables_template; 1422 Handle<FixedArray> indirect_tables_template;
1407 if (maybe_indirect_tables.ToHandle(&indirect_tables_template)) { 1423 if (maybe_indirect_tables.ToHandle(&indirect_tables_template)) {
1408 Handle<FixedArray> indirect_tables = SetupIndirectFunctionTable( 1424 Handle<FixedArray> indirect_tables = SetupIndirectFunctionTable(
1409 isolate, code_table, indirect_tables_template); 1425 isolate, code_table, indirect_tables_template);
(...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after
1699 return static_cast<int32_t>(HeapNumber::cast(*result)->value()); 1715 return static_cast<int32_t>(HeapNumber::cast(*result)->value());
1700 } 1716 }
1701 thrower->Error("WASM.compileRun() failed: Return value should be number"); 1717 thrower->Error("WASM.compileRun() failed: Return value should be number");
1702 return -1; 1718 return -1;
1703 } 1719 }
1704 1720
1705 } // namespace testing 1721 } // namespace testing
1706 } // namespace wasm 1722 } // namespace wasm
1707 } // namespace internal 1723 } // namespace internal
1708 } // namespace v8 1724 } // namespace v8
OLDNEW
« 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