| 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" |
| 11 #include "src/objects.h" | 11 #include "src/objects.h" |
| 12 #include "src/property-descriptor.h" | 12 #include "src/property-descriptor.h" |
| 13 #include "src/simulator.h" | 13 #include "src/simulator.h" |
| 14 #include "src/snapshot/snapshot.h" | 14 #include "src/snapshot/snapshot.h" |
| 15 #include "src/v8.h" | 15 #include "src/v8.h" |
| 16 | 16 |
| 17 #include "src/wasm/ast-decoder.h" | 17 #include "src/wasm/ast-decoder.h" |
| 18 #include "src/wasm/module-decoder.h" | 18 #include "src/wasm/module-decoder.h" |
| 19 #include "src/wasm/wasm-js.h" | 19 #include "src/wasm/wasm-js.h" |
| 20 #include "src/wasm/wasm-module.h" | 20 #include "src/wasm/wasm-module.h" |
| 21 #include "src/wasm/wasm-objects.h" | 21 #include "src/wasm/wasm-objects.h" |
| 22 #include "src/wasm/wasm-result.h" | 22 #include "src/wasm/wasm-result.h" |
| 23 #include "src/wasm/wasm-text.h" |
| 23 | 24 |
| 24 #include "src/compiler/wasm-compiler.h" | 25 #include "src/compiler/wasm-compiler.h" |
| 25 | 26 |
| 26 using namespace v8::internal; | 27 using namespace v8::internal; |
| 27 using namespace v8::internal::wasm; | 28 using namespace v8::internal::wasm; |
| 28 namespace base = v8::base; | 29 namespace base = v8::base; |
| 29 | 30 |
| 30 #define TRACE(...) \ | 31 #define TRACE(...) \ |
| 31 do { \ | 32 do { \ |
| 32 if (FLAG_trace_wasm_instances) PrintF(__VA_ARGS__); \ | 33 if (FLAG_trace_wasm_instances) PrintF(__VA_ARGS__); \ |
| (...skipping 594 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 627 WasmModule* module = compiled_module->module(); | 628 WasmModule* module = compiled_module->module(); |
| 628 if (func_index < 0 || | 629 if (func_index < 0 || |
| 629 static_cast<size_t>(func_index) > module->functions.size()) { | 630 static_cast<size_t>(func_index) > module->functions.size()) { |
| 630 return {0, 0}; | 631 return {0, 0}; |
| 631 } | 632 } |
| 632 WasmFunction& func = module->functions[func_index]; | 633 WasmFunction& func = module->functions[func_index]; |
| 633 return {static_cast<int>(func.code_start_offset), | 634 return {static_cast<int>(func.code_start_offset), |
| 634 static_cast<int>(func.code_end_offset - func.code_start_offset)}; | 635 static_cast<int>(func.code_end_offset - func.code_start_offset)}; |
| 635 } | 636 } |
| 636 | 637 |
| 637 Vector<const uint8_t> GetFunctionBytes( | |
| 638 Handle<WasmCompiledModule> compiled_module, int func_index) { | |
| 639 int offset, length; | |
| 640 std::tie(offset, length) = | |
| 641 GetFunctionOffsetAndLength(compiled_module, func_index); | |
| 642 return Vector<const uint8_t>( | |
| 643 compiled_module->module_bytes()->GetChars() + offset, length); | |
| 644 } | |
| 645 | |
| 646 } // namespace | 638 } // namespace |
| 647 | 639 |
| 648 Handle<JSArrayBuffer> wasm::NewArrayBuffer(Isolate* isolate, size_t size, | 640 Handle<JSArrayBuffer> wasm::NewArrayBuffer(Isolate* isolate, size_t size, |
| 649 bool enable_guard_regions) { | 641 bool enable_guard_regions) { |
| 650 if (size > (WasmModule::kV8MaxPages * WasmModule::kPageSize)) { | 642 if (size > (WasmModule::kV8MaxPages * WasmModule::kPageSize)) { |
| 651 // TODO(titzer): lift restriction on maximum memory allocated here. | 643 // TODO(titzer): lift restriction on maximum memory allocated here. |
| 652 return Handle<JSArrayBuffer>::null(); | 644 return Handle<JSArrayBuffer>::null(); |
| 653 } | 645 } |
| 654 | 646 |
| 655 enable_guard_regions = enable_guard_regions && kGuardRegionsSupported; | 647 enable_guard_regions = enable_guard_regions && kGuardRegionsSupported; |
| (...skipping 1314 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1970 Handle<Script> wasm::GetScript(Handle<JSObject> instance) { | 1962 Handle<Script> wasm::GetScript(Handle<JSObject> instance) { |
| 1971 WasmCompiledModule* compiled_module = | 1963 WasmCompiledModule* compiled_module = |
| 1972 WasmInstanceObject::cast(*instance)->get_compiled_module(); | 1964 WasmInstanceObject::cast(*instance)->get_compiled_module(); |
| 1973 DCHECK(compiled_module->has_script()); | 1965 DCHECK(compiled_module->has_script()); |
| 1974 return compiled_module->script(); | 1966 return compiled_module->script(); |
| 1975 } | 1967 } |
| 1976 | 1968 |
| 1977 std::pair<std::string, std::vector<std::tuple<uint32_t, int, int>>> | 1969 std::pair<std::string, std::vector<std::tuple<uint32_t, int, int>>> |
| 1978 wasm::DisassembleFunction(Handle<WasmCompiledModule> compiled_module, | 1970 wasm::DisassembleFunction(Handle<WasmCompiledModule> compiled_module, |
| 1979 int func_index) { | 1971 int func_index) { |
| 1972 if (func_index < 0 || |
| 1973 static_cast<uint32_t>(func_index) >= |
| 1974 compiled_module->module()->functions.size()) |
| 1975 return {}; |
| 1976 |
| 1980 std::ostringstream disassembly_os; | 1977 std::ostringstream disassembly_os; |
| 1981 std::vector<std::tuple<uint32_t, int, int>> offset_table; | 1978 std::vector<std::tuple<uint32_t, int, int>> offset_table; |
| 1982 | 1979 |
| 1983 Vector<const uint8_t> func_bytes = | 1980 PrintWasmText(compiled_module->module(), static_cast<uint32_t>(func_index), |
| 1984 GetFunctionBytes(compiled_module, func_index); | 1981 disassembly_os, &offset_table); |
| 1985 DisallowHeapAllocation no_gc; | |
| 1986 if (func_bytes.is_empty()) return {}; | |
| 1987 | |
| 1988 AccountingAllocator allocator; | |
| 1989 bool ok = PrintAst( | |
| 1990 &allocator, FunctionBodyForTesting(func_bytes.start(), func_bytes.end()), | |
| 1991 disassembly_os, &offset_table); | |
| 1992 CHECK(ok); | |
| 1993 | 1982 |
| 1994 return {disassembly_os.str(), std::move(offset_table)}; | 1983 return {disassembly_os.str(), std::move(offset_table)}; |
| 1995 } | 1984 } |
| 1996 | 1985 |
| 1997 int wasm::GetAsmWasmSourcePosition(Handle<JSObject> instance, int func_index, | 1986 int wasm::GetAsmWasmSourcePosition(Handle<JSObject> instance, int func_index, |
| 1998 int byte_offset) { | 1987 int byte_offset) { |
| 1999 return WasmDebugInfo::GetAsmJsSourcePosition(GetDebugInfo(instance), | 1988 return WasmDebugInfo::GetAsmJsSourcePosition(GetDebugInfo(instance), |
| 2000 func_index, byte_offset); | 1989 func_index, byte_offset); |
| 2001 } | 1990 } |
| 2002 | 1991 |
| (...skipping 20 matching lines...) Expand all Loading... |
| 2023 ModuleOrigin origin, Handle<Script> asm_js_script, | 2012 ModuleOrigin origin, Handle<Script> asm_js_script, |
| 2024 const byte* asm_js_offset_tables_start, | 2013 const byte* asm_js_offset_tables_start, |
| 2025 const byte* asm_js_offset_tables_end) { | 2014 const byte* asm_js_offset_tables_end) { |
| 2026 MaybeHandle<WasmModuleObject> nothing; | 2015 MaybeHandle<WasmModuleObject> nothing; |
| 2027 ModuleResult result = DecodeWasmModule(isolate, start, end, false, origin); | 2016 ModuleResult result = DecodeWasmModule(isolate, start, end, false, origin); |
| 2028 if (result.failed()) { | 2017 if (result.failed()) { |
| 2029 if (result.val) delete result.val; | 2018 if (result.val) delete result.val; |
| 2030 thrower->CompileFailed("Wasm decoding failed", result); | 2019 thrower->CompileFailed("Wasm decoding failed", result); |
| 2031 return nothing; | 2020 return nothing; |
| 2032 } | 2021 } |
| 2022 |
| 2033 // The {module_wrapper} will take ownership of the {WasmModule} object, | 2023 // The {module_wrapper} will take ownership of the {WasmModule} object, |
| 2034 // and it will be destroyed when the GC reclaims the wrapper object. | 2024 // and it will be destroyed when the GC reclaims the wrapper object. |
| 2035 Handle<WasmModuleWrapper> module_wrapper = | 2025 Handle<WasmModuleWrapper> module_wrapper = |
| 2036 WasmModuleWrapper::New(isolate, const_cast<WasmModule*>(result.val)); | 2026 WasmModuleWrapper::New(isolate, const_cast<WasmModule*>(result.val)); |
| 2037 | 2027 |
| 2038 // Compile the functions of the module, producing a compiled module. | 2028 // Compile the functions of the module, producing a compiled module. |
| 2039 MaybeHandle<WasmCompiledModule> maybe_compiled_module = | 2029 MaybeHandle<WasmCompiledModule> maybe_compiled_module = |
| 2040 result.val->CompileFunctions(isolate, module_wrapper, thrower); | 2030 result.val->CompileFunctions(isolate, module_wrapper, thrower); |
| 2041 | 2031 |
| 2042 if (maybe_compiled_module.is_null()) return nothing; | 2032 if (maybe_compiled_module.is_null()) return nothing; |
| (...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2305 MaybeHandle<String> WasmCompiledModule::GetFunctionName( | 2295 MaybeHandle<String> WasmCompiledModule::GetFunctionName( |
| 2306 Handle<WasmCompiledModule> compiled_module, uint32_t func_index) { | 2296 Handle<WasmCompiledModule> compiled_module, uint32_t func_index) { |
| 2307 DCHECK_LT(func_index, compiled_module->module()->functions.size()); | 2297 DCHECK_LT(func_index, compiled_module->module()->functions.size()); |
| 2308 WasmFunction& function = compiled_module->module()->functions[func_index]; | 2298 WasmFunction& function = compiled_module->module()->functions[func_index]; |
| 2309 Isolate* isolate = compiled_module->GetIsolate(); | 2299 Isolate* isolate = compiled_module->GetIsolate(); |
| 2310 MaybeHandle<String> string = ExtractStringFromModuleBytes( | 2300 MaybeHandle<String> string = ExtractStringFromModuleBytes( |
| 2311 isolate, compiled_module, function.name_offset, function.name_length); | 2301 isolate, compiled_module, function.name_offset, function.name_length); |
| 2312 if (!string.is_null()) return string.ToHandleChecked(); | 2302 if (!string.is_null()) return string.ToHandleChecked(); |
| 2313 return {}; | 2303 return {}; |
| 2314 } | 2304 } |
| OLD | NEW |