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

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

Issue 2784233004: [wasm] Further simplify WasmCompiledModule. (Closed)
Patch Set: . Created 3 years, 8 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 | « no previous file | src/wasm/wasm-objects.h » ('j') | src/wasm/wasm-objects.h » ('J')
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/assembler-inl.h" 7 #include "src/assembler-inl.h"
8 #include "src/base/adapters.h" 8 #include "src/base/adapters.h"
9 #include "src/base/atomic-utils.h" 9 #include "src/base/atomic-utils.h"
10 #include "src/code-stubs.h" 10 #include "src/code-stubs.h"
(...skipping 590 matching lines...) Expand 10 before | Expand all | Expand 10 after
601 601
602 Handle<WasmSharedModuleData> shared = WasmSharedModuleData::New( 602 Handle<WasmSharedModuleData> shared = WasmSharedModuleData::New(
603 isolate_, module_wrapper, Handle<SeqOneByteString>::cast(module_bytes), 603 isolate_, module_wrapper, Handle<SeqOneByteString>::cast(module_bytes),
604 script, asm_js_offset_table); 604 script, asm_js_offset_table);
605 if (lazy_compile) WasmSharedModuleData::PrepareForLazyCompilation(shared); 605 if (lazy_compile) WasmSharedModuleData::PrepareForLazyCompilation(shared);
606 606
607 // Create the compiled module object, and populate with compiled functions 607 // Create the compiled module object, and populate with compiled functions
608 // and information needed at instantiation time. This object needs to be 608 // and information needed at instantiation time. This object needs to be
609 // serializable. Instantiation may occur off a deserialized version of this 609 // serializable. Instantiation may occur off a deserialized version of this
610 // object. 610 // object.
611 Handle<WasmCompiledModule> compiled_module = 611 Handle<WasmCompiledModule> compiled_module = WasmCompiledModule::New(
612 WasmCompiledModule::New(isolate_, shared); 612 isolate_, shared, code_table, function_tables, signature_tables);
613 compiled_module->set_num_imported_functions(
614 module_->num_imported_functions);
615 compiled_module->set_code_table(code_table);
616 compiled_module->set_min_mem_pages(module_->min_mem_pages);
617 compiled_module->set_max_mem_pages(module_->max_mem_pages);
618 if (function_table_count > 0) { 613 if (function_table_count > 0) {
619 compiled_module->set_function_tables(function_tables); 614 compiled_module->set_function_tables(function_tables);
620 compiled_module->set_signature_tables(signature_tables);
621 compiled_module->set_empty_function_tables(function_tables);
622 } 615 }
623 616
624 // If we created a wasm script, finish it now and make it public to the 617 // If we created a wasm script, finish it now and make it public to the
625 // debugger. 618 // debugger.
626 if (asm_js_script.is_null()) { 619 if (asm_js_script.is_null()) {
627 script->set_wasm_compiled_module(*compiled_module); 620 script->set_wasm_compiled_module(*compiled_module);
628 isolate_->debug()->OnAfterCompile(script); 621 isolate_->debug()->OnAfterCompile(script);
629 } 622 }
630 623
631 // Compile JS->WASM wrappers for exported functions. 624 // Compile JS->WASM wrappers for exported functions.
(...skipping 459 matching lines...) Expand 10 before | Expand all | Expand 10 after
1091 HistogramTimerScope wasm_instantiate_module_time_scope( 1084 HistogramTimerScope wasm_instantiate_module_time_scope(
1092 module_->is_wasm() 1085 module_->is_wasm()
1093 ? isolate_->counters()->wasm_instantiate_wasm_module_time() 1086 ? isolate_->counters()->wasm_instantiate_wasm_module_time()
1094 : isolate_->counters()->wasm_instantiate_asm_module_time()); 1087 : isolate_->counters()->wasm_instantiate_asm_module_time());
1095 Factory* factory = isolate_->factory(); 1088 Factory* factory = isolate_->factory();
1096 1089
1097 //-------------------------------------------------------------------------- 1090 //--------------------------------------------------------------------------
1098 // Reuse the compiled module (if no owner), otherwise clone. 1091 // Reuse the compiled module (if no owner), otherwise clone.
1099 //-------------------------------------------------------------------------- 1092 //--------------------------------------------------------------------------
1100 Handle<FixedArray> code_table; 1093 Handle<FixedArray> code_table;
1094 // We keep around a copy of the old code table, because we'll be replacing
1095 // imports for the new instance, and then we need the old imports to be
1096 // able to relocate.
1101 Handle<FixedArray> old_code_table; 1097 Handle<FixedArray> old_code_table;
1102 MaybeHandle<WasmInstanceObject> owner; 1098 MaybeHandle<WasmInstanceObject> owner;
1103 1099
1104 TRACE("Starting new module instantiation\n"); 1100 TRACE("Starting new module instantiation\n");
1105 { 1101 {
1106 // Root the owner, if any, before doing any allocations, which 1102 // Root the owner, if any, before doing any allocations, which
1107 // may trigger GC. 1103 // may trigger GC.
1108 // Both owner and original template need to be in sync. Even 1104 // Both owner and original template need to be in sync. Even
1109 // after we lose the original template handle, the code 1105 // after we lose the original template handle, the code
1110 // objects we copied from it have data relative to the 1106 // objects we copied from it have data relative to the
1111 // instance - such as globals addresses. 1107 // instance - such as globals addresses.
1112 Handle<WasmCompiledModule> original; 1108 Handle<WasmCompiledModule> original;
1113 { 1109 {
1114 DisallowHeapAllocation no_gc; 1110 DisallowHeapAllocation no_gc;
1115 original = handle(module_object_->compiled_module()); 1111 original = handle(module_object_->compiled_module());
1116 if (original->has_weak_owning_instance()) { 1112 if (original->has_weak_owning_instance()) {
1117 owner = handle(WasmInstanceObject::cast( 1113 owner = handle(WasmInstanceObject::cast(
1118 original->weak_owning_instance()->value())); 1114 original->weak_owning_instance()->value()));
1119 } 1115 }
1120 } 1116 }
1121 DCHECK(!original.is_null()); 1117 DCHECK(!original.is_null());
1122 // Always make a new copy of the code_table, since the old_code_table
1123 // may still have placeholders for imports.
1124 old_code_table = original->code_table();
1125 code_table = factory->CopyFixedArray(old_code_table);
1126
1127 if (original->has_weak_owning_instance()) { 1118 if (original->has_weak_owning_instance()) {
1128 // Clone, but don't insert yet the clone in the instances chain. 1119 // Clone, but don't insert yet the clone in the instances chain.
1129 // We do that last. Since we are holding on to the owner instance, 1120 // We do that last. Since we are holding on to the owner instance,
1130 // the owner + original state used for cloning and patching 1121 // the owner + original state used for cloning and patching
1131 // won't be mutated by possible finalizer runs. 1122 // won't be mutated by possible finalizer runs.
1132 DCHECK(!owner.is_null()); 1123 DCHECK(!owner.is_null());
1133 TRACE("Cloning from %d\n", original->instance_id()); 1124 TRACE("Cloning from %d\n", original->instance_id());
1125 old_code_table = original->code_table();
1134 compiled_module_ = WasmCompiledModule::Clone(isolate_, original); 1126 compiled_module_ = WasmCompiledModule::Clone(isolate_, original);
1127 code_table = compiled_module_->code_table();
1135 // Avoid creating too many handles in the outer scope. 1128 // Avoid creating too many handles in the outer scope.
1136 HandleScope scope(isolate_); 1129 HandleScope scope(isolate_);
1137 1130
1138 // Clone the code for WASM functions and exports. 1131 // Clone the code for WASM functions and exports.
1139 for (int i = 0; i < code_table->length(); ++i) { 1132 for (int i = 0; i < code_table->length(); ++i) {
1140 Handle<Code> orig_code(Code::cast(code_table->get(i)), isolate_); 1133 Handle<Code> orig_code(Code::cast(code_table->get(i)), isolate_);
1141 switch (orig_code->kind()) { 1134 switch (orig_code->kind()) {
1142 case Code::WASM_TO_JS_FUNCTION: 1135 case Code::WASM_TO_JS_FUNCTION:
1143 // Imports will be overwritten with newly compiled wrappers. 1136 // Imports will be overwritten with newly compiled wrappers.
1144 break; 1137 break;
(...skipping 17 matching lines...) Expand all
1162 break; 1155 break;
1163 } 1156 }
1164 default: 1157 default:
1165 UNREACHABLE(); 1158 UNREACHABLE();
1166 } 1159 }
1167 } 1160 }
1168 RecordStats(isolate_, code_table); 1161 RecordStats(isolate_, code_table);
1169 } else { 1162 } else {
1170 // There was no owner, so we can reuse the original. 1163 // There was no owner, so we can reuse the original.
1171 compiled_module_ = original; 1164 compiled_module_ = original;
1165 old_code_table =
1166 factory->CopyFixedArray(compiled_module_->code_table());
1167 code_table = compiled_module_->code_table();
1172 TRACE("Reusing existing instance %d\n", 1168 TRACE("Reusing existing instance %d\n",
1173 compiled_module_->instance_id()); 1169 compiled_module_->instance_id());
1174 } 1170 }
1175 compiled_module_->set_code_table(code_table);
1176 compiled_module_->set_native_context(isolate_->native_context()); 1171 compiled_module_->set_native_context(isolate_->native_context());
1177 } 1172 }
1178 1173
1179 //-------------------------------------------------------------------------- 1174 //--------------------------------------------------------------------------
1180 // Allocate the instance object. 1175 // Allocate the instance object.
1181 //-------------------------------------------------------------------------- 1176 //--------------------------------------------------------------------------
1182 Zone instantiation_zone(isolate_->allocator(), ZONE_NAME); 1177 Zone instantiation_zone(isolate_->allocator(), ZONE_NAME);
1183 CodeSpecialization code_specialization(isolate_, &instantiation_zone); 1178 CodeSpecialization code_specialization(isolate_, &instantiation_zone);
1184 Handle<WasmInstanceObject> instance = 1179 Handle<WasmInstanceObject> instance =
1185 WasmInstanceObject::New(isolate_, compiled_module_); 1180 WasmInstanceObject::New(isolate_, compiled_module_);
(...skipping 1757 matching lines...) Expand 10 before | Expand all | Expand 10 after
2943 callee_compiled->instruction_start()); 2938 callee_compiled->instruction_start());
2944 } 2939 }
2945 DCHECK_EQ(non_compiled_functions.size(), idx); 2940 DCHECK_EQ(non_compiled_functions.size(), idx);
2946 } 2941 }
2947 2942
2948 Code* ret = 2943 Code* ret =
2949 Code::cast(compiled_module->code_table()->get(func_to_return_idx)); 2944 Code::cast(compiled_module->code_table()->get(func_to_return_idx));
2950 DCHECK_EQ(Code::WASM_FUNCTION, ret->kind()); 2945 DCHECK_EQ(Code::WASM_FUNCTION, ret->kind());
2951 return handle(ret, isolate); 2946 return handle(ret, isolate);
2952 } 2947 }
OLDNEW
« no previous file with comments | « no previous file | src/wasm/wasm-objects.h » ('j') | src/wasm/wasm-objects.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698