Index: src/asmjs/asm-js.cc |
diff --git a/src/asmjs/asm-js.cc b/src/asmjs/asm-js.cc |
index af27beef9a2c354d9311127e1076ad6c0119a803..a30ac674233fa8ec8ed4bb56c3af6c5c75bed4c4 100644 |
--- a/src/asmjs/asm-js.cc |
+++ b/src/asmjs/asm-js.cc |
@@ -31,6 +31,15 @@ namespace v8 { |
namespace internal { |
namespace { |
+enum WasmDataEntries { |
+ kWasmDataCompiledModule, |
+ kWasmDataForeignGlobals, |
+ kWasmDataUsesArray, |
+ kWasmDataScript, |
+ kWasmDataScriptPosition, |
+ kWasmDataEntryCount, |
+}; |
+ |
Handle<i::Object> StdlibMathMember(i::Isolate* isolate, |
Handle<JSReceiver> stdlib, |
Handle<Name> name) { |
@@ -151,8 +160,10 @@ bool IsStdlibMemberValid(i::Isolate* isolate, Handle<JSReceiver> stdlib, |
} // namespace |
-MaybeHandle<FixedArray> AsmJs::ConvertAsmToWasm(ParseInfo* info) { |
+MaybeHandle<FixedArray> AsmJs::CompileAsmViaWasm(ParseInfo* info) { |
ErrorThrower thrower(info->isolate(), "Asm.js -> WebAssembly conversion"); |
+ base::ElapsedTimer asm_wasm_timer; |
+ asm_wasm_timer.Start(); |
wasm::AsmWasmBuilder builder(info->isolate(), info->zone(), |
info->ast_value_factory(), info->script(), |
info->literal()); |
@@ -165,14 +176,19 @@ MaybeHandle<FixedArray> AsmJs::ConvertAsmToWasm(ParseInfo* info) { |
builder.typer()->error_message()); |
return MaybeHandle<FixedArray>(); |
} |
+ double asm_wasm_time = asm_wasm_timer.Elapsed().InMillisecondsF(); |
+ |
wasm::ZoneBuffer* module = asm_wasm_result.module_bytes; |
wasm::ZoneBuffer* asm_offsets = asm_wasm_result.asm_offset_table; |
+ base::ElapsedTimer compile_timer; |
+ compile_timer.Start(); |
MaybeHandle<JSObject> compiled = wasm::CreateModuleObjectFromBytes( |
info->isolate(), module->begin(), module->end(), &thrower, |
internal::wasm::kAsmJsOrigin, info->script(), asm_offsets->begin(), |
asm_offsets->end()); |
DCHECK(!compiled.is_null()); |
+ double compile_time = compile_timer.Elapsed().InMillisecondsF(); |
wasm::AsmTyper::StdlibSet uses = builder.typer()->StdlibUses(); |
Handle<FixedArray> uses_array = |
@@ -182,16 +198,37 @@ MaybeHandle<FixedArray> AsmJs::ConvertAsmToWasm(ParseInfo* info) { |
uses_array->set(count++, Smi::FromInt(i)); |
} |
- Handle<FixedArray> result = info->isolate()->factory()->NewFixedArray(3); |
- result->set(0, *compiled.ToHandleChecked()); |
- result->set(1, *foreign_globals); |
- result->set(2, *uses_array); |
+ Handle<FixedArray> result = |
+ info->isolate()->factory()->NewFixedArray(kWasmDataEntryCount); |
+ result->set(kWasmDataCompiledModule, *compiled.ToHandleChecked()); |
+ result->set(kWasmDataForeignGlobals, *foreign_globals); |
+ result->set(kWasmDataUsesArray, *uses_array); |
+ result->set(kWasmDataScript, *info->script()); |
+ result->set(kWasmDataScriptPosition, |
+ Smi::FromInt(info->literal()->position())); |
+ |
+ MessageLocation location(info->script(), info->literal()->position(), |
+ info->literal()->position()); |
+ char text[100]; |
+ int length = base::OS::SNPrintF(text, arraysize(text), |
+ "asm->wasm: %0.3f ms, compile: %0.3f ms", |
+ asm_wasm_time, compile_time); |
+ DCHECK_NE(-1, length); |
+ USE(length); |
+ Handle<String> stext(info->isolate()->factory()->InternalizeUtf8String(text)); |
+ Handle<JSMessageObject> message = MessageHandler::MakeMessageObject( |
+ info->isolate(), MessageTemplate::kAsmJsCompiled, &location, stext, |
+ Handle<JSArray>::null()); |
+ message->set_error_level(v8::Isolate::kMessageInfo); |
+ MessageHandler::ReportMessage(info->isolate(), &location, message); |
+ |
return result; |
} |
bool AsmJs::IsStdlibValid(i::Isolate* isolate, Handle<FixedArray> wasm_data, |
Handle<JSReceiver> stdlib) { |
- i::Handle<i::FixedArray> uses(i::FixedArray::cast(wasm_data->get(2))); |
+ i::Handle<i::FixedArray> uses( |
+ i::FixedArray::cast(wasm_data->get(kWasmDataUsesArray))); |
for (int i = 0; i < uses->length(); ++i) { |
if (!IsStdlibMemberValid(isolate, stdlib, |
uses->GetValueChecked<i::Object>(isolate, i))) { |
@@ -205,9 +242,12 @@ MaybeHandle<Object> AsmJs::InstantiateAsmWasm(i::Isolate* isolate, |
Handle<FixedArray> wasm_data, |
Handle<JSArrayBuffer> memory, |
Handle<JSReceiver> foreign) { |
- i::Handle<i::JSObject> module(i::JSObject::cast(wasm_data->get(0))); |
+ base::ElapsedTimer instantiate_timer; |
+ instantiate_timer.Start(); |
+ i::Handle<i::JSObject> module( |
+ i::JSObject::cast(wasm_data->get(kWasmDataCompiledModule))); |
i::Handle<i::FixedArray> foreign_globals( |
- i::FixedArray::cast(wasm_data->get(1))); |
+ i::FixedArray::cast(wasm_data->get(kWasmDataForeignGlobals))); |
ErrorThrower thrower(isolate, "Asm.js -> WebAssembly instantiation"); |
@@ -259,6 +299,26 @@ MaybeHandle<Object> AsmJs::InstantiateAsmWasm(i::Isolate* isolate, |
!single_function.ToHandleChecked()->IsUndefined(isolate)) { |
return single_function; |
} |
+ |
+ i::Handle<i::Script> script(i::Script::cast(wasm_data->get(kWasmDataScript))); |
+ int32_t position = 0; |
+ if (!wasm_data->get(kWasmDataScriptPosition)->ToInt32(&position)) { |
+ UNREACHABLE(); |
+ } |
+ MessageLocation location(script, position, position); |
+ char text[50]; |
+ int length = |
+ base::OS::SNPrintF(text, arraysize(text), "%0.3f ms", |
+ instantiate_timer.Elapsed().InMillisecondsF()); |
+ DCHECK_NE(-1, length); |
+ USE(length); |
+ Handle<String> stext(isolate->factory()->InternalizeUtf8String(text)); |
+ Handle<JSMessageObject> message = MessageHandler::MakeMessageObject( |
+ isolate, MessageTemplate::kAsmJsInstantiated, &location, stext, |
+ Handle<JSArray>::null()); |
+ message->set_error_level(v8::Isolate::kMessageInfo); |
+ MessageHandler::ReportMessage(isolate, &location, message); |
+ |
return module_object; |
} |