OLD | NEW |
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 1242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1253 if (function_table_count > 0) InitializeTables(code_table, instance); | 1253 if (function_table_count > 0) InitializeTables(code_table, instance); |
1254 | 1254 |
1255 if (num_imported_functions > 0 || !owner.is_null()) { | 1255 if (num_imported_functions > 0 || !owner.is_null()) { |
1256 // If the code was cloned, or new imports were compiled, patch. | 1256 // If the code was cloned, or new imports were compiled, patch. |
1257 PatchDirectCalls(old_code_table, code_table, num_imported_functions); | 1257 PatchDirectCalls(old_code_table, code_table, num_imported_functions); |
1258 } | 1258 } |
1259 | 1259 |
1260 FlushICache(isolate_, code_table); | 1260 FlushICache(isolate_, code_table); |
1261 | 1261 |
1262 //-------------------------------------------------------------------------- | 1262 //-------------------------------------------------------------------------- |
| 1263 // Unpack and notify signal handler of protected instructions. |
| 1264 //-------------------------------------------------------------------------- |
| 1265 { |
| 1266 for (int i = 0; i < code_table->length(); ++i) { |
| 1267 Handle<Code> code = code_table->GetValueChecked<Code>(isolate_, i); |
| 1268 |
| 1269 if (code->kind() != Code::WASM_FUNCTION) { |
| 1270 continue; |
| 1271 } |
| 1272 |
| 1273 FixedArray* protected_instructions = code->protected_instructions(); |
| 1274 |
| 1275 Zone zone(isolate_->allocator(), "Wasm Module"); |
| 1276 ZoneVector<trap_handler::ProtectedInstructionData> unpacked(&zone); |
| 1277 for (int i = 0; i < protected_instructions->length(); |
| 1278 i += Code::kTrapDataSize) { |
| 1279 trap_handler::ProtectedInstructionData data; |
| 1280 data.instr_offset = |
| 1281 protected_instructions |
| 1282 ->GetValueChecked<Smi>(isolate_, i + Code::kTrapCodeOffset) |
| 1283 ->value(); |
| 1284 data.landing_offset = |
| 1285 protected_instructions |
| 1286 ->GetValueChecked<Smi>(isolate_, i + Code::kTrapLandingOffset) |
| 1287 ->value(); |
| 1288 unpacked.emplace_back(data); |
| 1289 } |
| 1290 // TODO(eholk): Register the protected instruction information once the |
| 1291 // trap handler is in place. |
| 1292 } |
| 1293 } |
| 1294 |
1263 // Set up and link the new instance. | 1295 // Set up and link the new instance. |
1264 //-------------------------------------------------------------------------- | 1296 //-------------------------------------------------------------------------- |
1265 { | 1297 { |
1266 Handle<Object> global_handle = | 1298 Handle<Object> global_handle = |
1267 isolate_->global_handles()->Create(*instance); | 1299 isolate_->global_handles()->Create(*instance); |
1268 Handle<WeakCell> link_to_clone = factory->NewWeakCell(compiled_module_); | 1300 Handle<WeakCell> link_to_clone = factory->NewWeakCell(compiled_module_); |
1269 Handle<WeakCell> link_to_owning_instance = factory->NewWeakCell(instance); | 1301 Handle<WeakCell> link_to_owning_instance = factory->NewWeakCell(instance); |
1270 MaybeHandle<WeakCell> link_to_original; | 1302 MaybeHandle<WeakCell> link_to_original; |
1271 MaybeHandle<WasmCompiledModule> original; | 1303 MaybeHandle<WasmCompiledModule> original; |
1272 if (!owner.is_null()) { | 1304 if (!owner.is_null()) { |
(...skipping 1078 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2351 MaybeHandle<String> WasmCompiledModule::GetFunctionName( | 2383 MaybeHandle<String> WasmCompiledModule::GetFunctionName( |
2352 Handle<WasmCompiledModule> compiled_module, uint32_t func_index) { | 2384 Handle<WasmCompiledModule> compiled_module, uint32_t func_index) { |
2353 DCHECK_LT(func_index, compiled_module->module()->functions.size()); | 2385 DCHECK_LT(func_index, compiled_module->module()->functions.size()); |
2354 WasmFunction& function = compiled_module->module()->functions[func_index]; | 2386 WasmFunction& function = compiled_module->module()->functions[func_index]; |
2355 Isolate* isolate = compiled_module->GetIsolate(); | 2387 Isolate* isolate = compiled_module->GetIsolate(); |
2356 MaybeHandle<String> string = ExtractStringFromModuleBytes( | 2388 MaybeHandle<String> string = ExtractStringFromModuleBytes( |
2357 isolate, compiled_module, function.name_offset, function.name_length); | 2389 isolate, compiled_module, function.name_offset, function.name_length); |
2358 if (!string.is_null()) return string.ToHandleChecked(); | 2390 if (!string.is_null()) return string.ToHandleChecked(); |
2359 return {}; | 2391 return {}; |
2360 } | 2392 } |
OLD | NEW |