diff --git a/BUILD.gn b/BUILD.gn index d0409fd8e2..8c018c956c 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -1081,12 +1081,8 @@ v8_source_set("v8_base") { "src/asmjs/asm-parser.h", "src/asmjs/asm-scanner.cc", "src/asmjs/asm-scanner.h", - "src/asmjs/asm-typer.cc", - "src/asmjs/asm-typer.h", "src/asmjs/asm-types.cc", "src/asmjs/asm-types.h", - "src/asmjs/asm-wasm-builder.cc", - "src/asmjs/asm-wasm-builder.h", "src/asmjs/switch-logic.cc", "src/asmjs/switch-logic.h", "src/assembler-inl.h", diff --git a/src/asmjs/OWNERS b/src/asmjs/OWNERS index 474eaee1ce..4f54661aeb 100644 --- a/src/asmjs/OWNERS +++ b/src/asmjs/OWNERS @@ -1,5 +1,3 @@ -# Keep in sync with test/cctest/asmjs/OWNERS. - set noparent ahaas@chromium.org diff --git a/src/asmjs/asm-js.cc b/src/asmjs/asm-js.cc index d7a553b25e..b230010f9a 100644 --- a/src/asmjs/asm-js.cc +++ b/src/asmjs/asm-js.cc @@ -8,9 +8,8 @@ #include "src/api.h" #include "src/asmjs/asm-names.h" #include "src/asmjs/asm-parser.h" -#include "src/asmjs/asm-typer.h" -#include "src/asmjs/asm-wasm-builder.h" #include "src/assert-scope.h" +#include "src/ast/ast.h" #include "src/base/platform/elapsed-timer.h" #include "src/compilation-info.h" #include "src/execution.h" @@ -30,6 +29,8 @@ namespace v8 { namespace internal { +const char* const AsmJs::kSingleFunctionName = "__single_function__"; + namespace { enum WasmDataEntries { kWasmDataCompiledModule, @@ -63,18 +64,10 @@ Handle StdlibMathMember(Isolate* isolate, Handle stdlib, } bool IsStdlibMemberValid(Isolate* isolate, Handle stdlib, - wasm::AsmTyper::StandardMember member, + wasm::AsmJsParser::StandardMember member, bool* is_typed_array) { switch (member) { - case wasm::AsmTyper::StandardMember::kNone: - case wasm::AsmTyper::StandardMember::kModule: - case wasm::AsmTyper::StandardMember::kStdlib: - case wasm::AsmTyper::StandardMember::kHeap: - case wasm::AsmTyper::StandardMember::kFFI: { - // Nothing to check for these. - return true; - } - case wasm::AsmTyper::StandardMember::kInfinity: { + case wasm::AsmJsParser::StandardMember::kInfinity: { if (stdlib.is_null()) { return false; } @@ -87,7 +80,7 @@ bool IsStdlibMemberValid(Isolate* isolate, Handle stdlib, Handle value = maybe_value.ToHandleChecked(); return value->IsNumber() && std::isinf(value->Number()); } - case wasm::AsmTyper::StandardMember::kNaN: { + case wasm::AsmJsParser::StandardMember::kNaN: { if (stdlib.is_null()) { return false; } @@ -101,7 +94,7 @@ bool IsStdlibMemberValid(Isolate* isolate, Handle stdlib, return value->IsNaN(); } #define STDLIB_MATH_FUNC(fname, FName, ignore1, ignore2) \ - case wasm::AsmTyper::StandardMember::kMath##FName: { \ + case wasm::AsmJsParser::StandardMember::kMath##FName: { \ Handle name(isolate->factory()->InternalizeOneByteString( \ STATIC_CHAR_VECTOR(#fname))); \ Handle value = StdlibMathMember(isolate, stdlib, name); \ @@ -115,7 +108,7 @@ bool IsStdlibMemberValid(Isolate* isolate, Handle stdlib, STDLIB_MATH_FUNCTION_LIST(STDLIB_MATH_FUNC) #undef STDLIB_MATH_FUNC #define STDLIB_MATH_CONST(cname, const_value) \ - case wasm::AsmTyper::StandardMember::kMath##cname: { \ + case wasm::AsmJsParser::StandardMember::kMath##cname: { \ Handle name(isolate->factory()->InternalizeOneByteString( \ STATIC_CHAR_VECTOR(#cname))); \ Handle value = StdlibMathMember(isolate, stdlib, name); \ @@ -125,7 +118,7 @@ bool IsStdlibMemberValid(Isolate* isolate, Handle stdlib, STDLIB_MATH_VALUE_LIST(STDLIB_MATH_CONST) #undef STDLIB_MATH_CONST #define STDLIB_ARRAY_TYPE(fname, FName) \ - case wasm::AsmTyper::StandardMember::k##FName: { \ + case wasm::AsmJsParser::StandardMember::k##FName: { \ *is_typed_array = true; \ if (stdlib.is_null()) { \ return false; \ @@ -163,7 +156,6 @@ MaybeHandle AsmJs::CompileAsmViaWasm(CompilationInfo* info) { Handle foreign_globals; base::ElapsedTimer asm_wasm_timer; asm_wasm_timer.Start(); - wasm::AsmWasmBuilder builder(info); size_t asm_wasm_zone_start = info->zone()->allocation_size(); { wasm::AsmJsParser parser(info->isolate(), info->zone(), info->script(), @@ -282,8 +274,8 @@ MaybeHandle AsmJs::InstantiateAsmWasm(Isolate* isolate, bool stdlib_use_of_typed_array_present = false; for (int i = 0; i < stdlib_uses->length(); ++i) { int member_id = Smi::cast(stdlib_uses->get(i))->value(); - wasm::AsmTyper::StandardMember member = - static_cast(member_id); + wasm::AsmJsParser::StandardMember member = + static_cast(member_id); if (!IsStdlibMemberValid(isolate, stdlib, member, &stdlib_use_of_typed_array_present)) { return MaybeHandle(); @@ -321,8 +313,8 @@ MaybeHandle AsmJs::InstantiateAsmWasm(Isolate* isolate, DCHECK(!thrower.error()); Handle module_object = maybe_module_object.ToHandleChecked(); - Handle single_function_name(isolate->factory()->InternalizeUtf8String( - wasm::AsmWasmBuilder::single_function_name)); + Handle single_function_name( + isolate->factory()->InternalizeUtf8String(AsmJs::kSingleFunctionName)); MaybeHandle single_function = Object::GetProperty(module_object, single_function_name); if (!single_function.is_null() && diff --git a/src/asmjs/asm-js.h b/src/asmjs/asm-js.h index 92bb1da69c..1443dc403e 100644 --- a/src/asmjs/asm-js.h +++ b/src/asmjs/asm-js.h @@ -22,6 +22,10 @@ class AsmJs { Handle stdlib, Handle foreign, Handle memory); + + // Special export name used to indicate that the module exports a single + // function instead of a JavaScript object holding multiple functions. + static const char* const kSingleFunctionName; }; } // namespace internal diff --git a/src/asmjs/asm-parser.cc b/src/asmjs/asm-parser.cc index 7097dbcd98..025576f2dc 100644 --- a/src/asmjs/asm-parser.cc +++ b/src/asmjs/asm-parser.cc @@ -9,10 +9,12 @@ #include +#include "src/asmjs/asm-js.h" #include "src/asmjs/asm-types.h" #include "src/objects-inl.h" #include "src/objects.h" #include "src/parsing/scanner-character-streams.h" +#include "src/parsing/scanner.h" #include "src/wasm/wasm-opcodes.h" namespace v8 { @@ -562,7 +564,7 @@ void AsmJsParser::ValidateModuleVarNewStdlib(VarInfo* info) { #define V(name, _junk1, _junk2, _junk3) \ case TOK(name): \ DeclareStdlibFunc(info, VarKind::kSpecial, AsmType::name()); \ - stdlib_uses_.insert(AsmTyper::k##name); \ + stdlib_uses_.insert(StandardMember::k##name); \ break; STDLIB_ARRAY_TYPE_LIST(V) #undef V @@ -585,14 +587,14 @@ void AsmJsParser::ValidateModuleVarStdlib(VarInfo* info) { case TOK(name): \ DeclareGlobal(info, false, AsmType::Double(), kWasmF64, \ WasmInitExpr(const_value)); \ - stdlib_uses_.insert(AsmTyper::kMath##name); \ + stdlib_uses_.insert(StandardMember::kMath##name); \ break; STDLIB_MATH_VALUE_LIST(V) #undef V #define V(name, Name, op, sig) \ case TOK(name): \ DeclareStdlibFunc(info, VarKind::kMath##Name, stdlib_##sig##_); \ - stdlib_uses_.insert(AsmTyper::kMath##Name); \ + stdlib_uses_.insert(StandardMember::kMath##Name); \ break; STDLIB_MATH_FUNCTION_LIST(V) #undef V @@ -602,11 +604,11 @@ void AsmJsParser::ValidateModuleVarStdlib(VarInfo* info) { } else if (Check(TOK(Infinity))) { DeclareGlobal(info, false, AsmType::Double(), kWasmF64, WasmInitExpr(std::numeric_limits::infinity())); - stdlib_uses_.insert(AsmTyper::kInfinity); + stdlib_uses_.insert(StandardMember::kInfinity); } else if (Check(TOK(NaN))) { DeclareGlobal(info, false, AsmType::Double(), kWasmF64, WasmInitExpr(std::numeric_limits::quiet_NaN())); - stdlib_uses_.insert(AsmTyper::kNaN); + stdlib_uses_.insert(StandardMember::kNaN); } else { FAIL("Invalid member of stdlib"); } @@ -649,8 +651,7 @@ void AsmJsParser::ValidateExport() { if (info->kind != VarKind::kFunction) { FAIL("Single function export must be a function"); } - const char* single_function_name = "__single_function__"; - info->function_builder->ExportAs(CStrVector(single_function_name)); + info->function_builder->ExportAs(CStrVector(AsmJs::kSingleFunctionName)); } } diff --git a/src/asmjs/asm-parser.h b/src/asmjs/asm-parser.h index 8e25c64096..4bcc97a779 100644 --- a/src/asmjs/asm-parser.h +++ b/src/asmjs/asm-parser.h @@ -9,7 +9,6 @@ #include #include "src/asmjs/asm-scanner.h" -#include "src/asmjs/asm-typer.h" #include "src/asmjs/asm-types.h" #include "src/wasm/wasm-module-builder.h" #include "src/zone/zone-containers.h" @@ -29,13 +28,31 @@ namespace wasm { // scopes (local + module wide). class AsmJsParser { public: + // clang-format off + enum StandardMember { + kInfinity, + kNaN, +#define V(_unused1, name, _unused2, _unused3) kMath##name, + STDLIB_MATH_FUNCTION_LIST(V) +#undef V +#define V(name, _unused1) kMath##name, + STDLIB_MATH_VALUE_LIST(V) +#undef V +#define V(name, _unused1, _unused2, _unused3) k##name, + STDLIB_ARRAY_TYPE_LIST(V) +#undef V + }; + // clang-format on + + typedef std::unordered_set> StdlibSet; + explicit AsmJsParser(Isolate* isolate, Zone* zone, Handle