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

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

Issue 2522953002: [wasm] Move asm.js offset table to compiled module (Closed)
Patch Set: Created 4 years, 1 month 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
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 1915 matching lines...) Expand 10 before | Expand all | Expand 10 after
1926 1926
1927 bool wasm::IsWasmInstance(Object* object) { 1927 bool wasm::IsWasmInstance(Object* object) {
1928 return WasmInstanceObject::IsWasmInstanceObject(object); 1928 return WasmInstanceObject::IsWasmInstanceObject(object);
1929 } 1929 }
1930 1930
1931 bool wasm::WasmIsAsmJs(Object* instance, Isolate* isolate) { 1931 bool wasm::WasmIsAsmJs(Object* instance, Isolate* isolate) {
1932 if (instance->IsUndefined(isolate)) return false; 1932 if (instance->IsUndefined(isolate)) return false;
1933 DCHECK(IsWasmInstance(instance)); 1933 DCHECK(IsWasmInstance(instance));
1934 WasmCompiledModule* compiled_module = 1934 WasmCompiledModule* compiled_module =
1935 WasmInstanceObject::cast(instance)->get_compiled_module(); 1935 WasmInstanceObject::cast(instance)->get_compiled_module();
1936 DCHECK_EQ(compiled_module->has_asm_js_offset_tables(), 1936 DCHECK_EQ(compiled_module->has_asm_js_offset_table(),
1937 compiled_module->script()->type() == Script::TYPE_NORMAL); 1937 compiled_module->script()->type() == Script::TYPE_NORMAL);
1938 return compiled_module->has_asm_js_offset_tables(); 1938 return compiled_module->has_asm_js_offset_table();
1939 } 1939 }
1940 1940
1941 Handle<Script> wasm::GetScript(Handle<JSObject> instance) { 1941 Handle<Script> wasm::GetScript(Handle<JSObject> instance) {
1942 WasmCompiledModule* compiled_module = 1942 WasmCompiledModule* compiled_module =
1943 WasmInstanceObject::cast(*instance)->get_compiled_module(); 1943 WasmInstanceObject::cast(*instance)->get_compiled_module();
1944 DCHECK(compiled_module->has_script()); 1944 DCHECK(compiled_module->has_script());
1945 return compiled_module->script(); 1945 return compiled_module->script();
1946 } 1946 }
1947 1947
1948 std::pair<std::string, std::vector<std::tuple<uint32_t, int, int>>> 1948 std::pair<std::string, std::vector<std::tuple<uint32_t, int, int>>>
1949 wasm::DisassembleFunction(Handle<WasmCompiledModule> compiled_module, 1949 wasm::DisassembleFunction(Handle<WasmCompiledModule> compiled_module,
1950 int func_index) { 1950 int func_index) {
1951 std::ostringstream disassembly_os; 1951 std::ostringstream disassembly_os;
1952 std::vector<std::tuple<uint32_t, int, int>> offset_table; 1952 std::vector<std::tuple<uint32_t, int, int>> offset_table;
1953 1953
1954 Vector<const uint8_t> func_bytes = 1954 Vector<const uint8_t> func_bytes =
1955 GetFunctionBytes(compiled_module, func_index); 1955 GetFunctionBytes(compiled_module, func_index);
1956 DisallowHeapAllocation no_gc; 1956 DisallowHeapAllocation no_gc;
1957 if (func_bytes.is_empty()) return {}; 1957 if (func_bytes.is_empty()) return {};
1958 1958
1959 AccountingAllocator allocator; 1959 AccountingAllocator allocator;
1960 bool ok = PrintAst( 1960 bool ok = PrintAst(
1961 &allocator, FunctionBodyForTesting(func_bytes.start(), func_bytes.end()), 1961 &allocator, FunctionBodyForTesting(func_bytes.start(), func_bytes.end()),
1962 disassembly_os, &offset_table); 1962 disassembly_os, &offset_table);
1963 CHECK(ok); 1963 CHECK(ok);
1964 1964
1965 return {disassembly_os.str(), std::move(offset_table)}; 1965 return {disassembly_os.str(), std::move(offset_table)};
1966 } 1966 }
1967 1967
1968 int wasm::GetAsmWasmSourcePosition(Handle<JSObject> instance, int func_index,
1969 int byte_offset) {
1970 return WasmDebugInfo::GetAsmJsSourcePosition(GetDebugInfo(instance),
1971 func_index, byte_offset);
1972 }
1973
1974 Handle<WasmDebugInfo> wasm::GetDebugInfo(Handle<JSObject> object) { 1968 Handle<WasmDebugInfo> wasm::GetDebugInfo(Handle<JSObject> object) {
1975 auto instance = Handle<WasmInstanceObject>::cast(object); 1969 auto instance = Handle<WasmInstanceObject>::cast(object);
1976 if (instance->has_debug_info()) { 1970 if (instance->has_debug_info()) {
1977 Handle<WasmDebugInfo> info(instance->get_debug_info(), 1971 Handle<WasmDebugInfo> info(instance->get_debug_info(),
1978 instance->GetIsolate()); 1972 instance->GetIsolate());
1979 return info; 1973 return info;
1980 } 1974 }
1981 Handle<WasmDebugInfo> new_info = WasmDebugInfo::New(instance); 1975 Handle<WasmDebugInfo> new_info = WasmDebugInfo::New(instance);
1982 instance->set_debug_info(*new_info); 1976 instance->set_debug_info(*new_info);
1983 return new_info; 1977 return new_info;
1984 } 1978 }
1985 1979
1986 int wasm::GetNumberOfFunctions(Handle<JSObject> object) {
1987 return static_cast<int>(
1988 Handle<WasmInstanceObject>::cast(object)->module()->functions.size());
1989 }
1990
1991 // TODO(clemensh): origin can be inferred from asm_js_script; remove it. 1980 // TODO(clemensh): origin can be inferred from asm_js_script; remove it.
1992 MaybeHandle<WasmModuleObject> wasm::CreateModuleObjectFromBytes( 1981 MaybeHandle<WasmModuleObject> wasm::CreateModuleObjectFromBytes(
1993 Isolate* isolate, const byte* start, const byte* end, ErrorThrower* thrower, 1982 Isolate* isolate, const byte* start, const byte* end, ErrorThrower* thrower,
1994 ModuleOrigin origin, Handle<Script> asm_js_script, 1983 ModuleOrigin origin, Handle<Script> asm_js_script,
1995 const byte* asm_js_offset_tables_start, 1984 const byte* asm_js_offset_tables_start,
1996 const byte* asm_js_offset_tables_end) { 1985 const byte* asm_js_offset_tables_end) {
1997 MaybeHandle<WasmModuleObject> nothing; 1986 MaybeHandle<WasmModuleObject> nothing;
1998 ModuleResult result = DecodeWasmModule(isolate, start, end, false, origin); 1987 ModuleResult result = DecodeWasmModule(isolate, start, end, false, origin);
1999 if (result.failed()) { 1988 if (result.failed()) {
2000 if (result.val) delete result.val; 1989 if (result.val) delete result.val;
2001 thrower->CompileFailed("Wasm decoding failed", result); 1990 thrower->CompileFailed("Wasm decoding failed", result);
2002 return nothing; 1991 return nothing;
2003 } 1992 }
2004 // The {module_wrapper} will take ownership of the {WasmModule} object, 1993 // The {module_wrapper} will take ownership of the {WasmModule} object,
2005 // and it will be destroyed when the GC reclaims the wrapper object. 1994 // and it will be destroyed when the GC reclaims the wrapper object.
2006 Handle<WasmModuleWrapper> module_wrapper = 1995 Handle<WasmModuleWrapper> module_wrapper =
2007 WasmModuleWrapper::New(isolate, const_cast<WasmModule*>(result.val)); 1996 WasmModuleWrapper::New(isolate, const_cast<WasmModule*>(result.val));
2008 1997
2009 // Compile the functions of the module, producing a compiled module. 1998 // Compile the functions of the module, producing a compiled module.
2010 MaybeHandle<WasmCompiledModule> maybe_compiled_module = 1999 MaybeHandle<WasmCompiledModule> maybe_compiled_module =
2011 result.val->CompileFunctions(isolate, module_wrapper, thrower); 2000 result.val->CompileFunctions(isolate, module_wrapper, thrower);
2012 2001
2013 if (maybe_compiled_module.is_null()) return nothing; 2002 if (maybe_compiled_module.is_null()) return nothing;
2014 2003
2015 Handle<WasmCompiledModule> compiled_module = 2004 Handle<WasmCompiledModule> compiled_module =
2016 maybe_compiled_module.ToHandleChecked(); 2005 maybe_compiled_module.ToHandleChecked();
2017 2006
2018 DCHECK_EQ(origin == kAsmJsOrigin, !asm_js_script.is_null()); 2007 DCHECK_EQ(origin == kAsmJsOrigin, !asm_js_script.is_null());
2019 DCHECK(!compiled_module->has_script()); 2008 DCHECK(!compiled_module->has_script());
2020 DCHECK(!compiled_module->has_asm_js_offset_tables()); 2009 DCHECK(!compiled_module->has_asm_js_offset_table());
2021 if (origin == kAsmJsOrigin) { 2010 if (origin == kAsmJsOrigin) {
2022 // Set script for the asm.js source, and the offset table mapping wasm byte 2011 // Set script for the asm.js source, and the offset table mapping wasm byte
2023 // offsets to source positions. 2012 // offsets to source positions.
2024 compiled_module->set_script(asm_js_script); 2013 compiled_module->set_script(asm_js_script);
2025 size_t offset_tables_len = 2014 size_t offset_table_len =
2026 asm_js_offset_tables_end - asm_js_offset_tables_start; 2015 asm_js_offset_tables_end - asm_js_offset_tables_start;
2027 DCHECK_GE(static_cast<size_t>(kMaxInt), offset_tables_len); 2016 DCHECK_GE(static_cast<size_t>(kMaxInt), offset_table_len);
2028 Handle<ByteArray> offset_tables = 2017 Handle<ByteArray> offset_table =
2029 isolate->factory()->NewByteArray(static_cast<int>(offset_tables_len)); 2018 isolate->factory()->NewByteArray(static_cast<int>(offset_table_len));
2030 memcpy(offset_tables->GetDataStartAddress(), asm_js_offset_tables_start, 2019 memcpy(offset_table->GetDataStartAddress(), asm_js_offset_tables_start,
2031 offset_tables_len); 2020 offset_table_len);
2032 compiled_module->set_asm_js_offset_tables(offset_tables); 2021 compiled_module->set_asm_js_offset_table(offset_table);
2033 } else { 2022 } else {
2034 // Create a new Script object representing this wasm module, store it in the 2023 // Create a new Script object representing this wasm module, store it in the
2035 // compiled wasm module, and register it at the debugger. 2024 // compiled wasm module, and register it at the debugger.
2036 Handle<Script> script = 2025 Handle<Script> script =
2037 isolate->factory()->NewScript(isolate->factory()->empty_string()); 2026 isolate->factory()->NewScript(isolate->factory()->empty_string());
2038 script->set_type(Script::TYPE_WASM); 2027 script->set_type(Script::TYPE_WASM);
2039 2028
2040 DCHECK_GE(kMaxInt, end - start); 2029 DCHECK_GE(kMaxInt, end - start);
2041 int hash = StringHasher::HashSequentialString( 2030 int hash = StringHasher::HashSequentialString(
2042 reinterpret_cast<const char*>(start), static_cast<int>(end - start), 2031 reinterpret_cast<const char*>(start), static_cast<int>(end - start),
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after
2276 MaybeHandle<String> WasmCompiledModule::GetFunctionName( 2265 MaybeHandle<String> WasmCompiledModule::GetFunctionName(
2277 Handle<WasmCompiledModule> compiled_module, uint32_t func_index) { 2266 Handle<WasmCompiledModule> compiled_module, uint32_t func_index) {
2278 DCHECK_LT(func_index, compiled_module->module()->functions.size()); 2267 DCHECK_LT(func_index, compiled_module->module()->functions.size());
2279 WasmFunction& function = compiled_module->module()->functions[func_index]; 2268 WasmFunction& function = compiled_module->module()->functions[func_index];
2280 Isolate* isolate = compiled_module->GetIsolate(); 2269 Isolate* isolate = compiled_module->GetIsolate();
2281 MaybeHandle<String> string = ExtractStringFromModuleBytes( 2270 MaybeHandle<String> string = ExtractStringFromModuleBytes(
2282 isolate, compiled_module, function.name_offset, function.name_length); 2271 isolate, compiled_module, function.name_offset, function.name_length);
2283 if (!string.is_null()) return string.ToHandleChecked(); 2272 if (!string.is_null()) return string.ToHandleChecked();
2284 return {}; 2273 return {};
2285 } 2274 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698