Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: c3c9754a47b03abd7bbada3d865d8842fbb618a2
      
https://github.com/WebKit/WebKit/commit/c3c9754a47b03abd7bbada3d865d8842fbb618a2
  Author: Asumu Takikawa <as...@igalia.com>
  Date:   2023-08-28 (Mon, 28 Aug 2023)

  Changed paths:
    M JSTests/wasm.yaml
    A JSTests/wasm/extended-const-spec-tests/data.wast.js
    A JSTests/wasm/extended-const-spec-tests/elem.wast.js
    A JSTests/wasm/extended-const-spec-tests/global.wast.js
    A JSTests/wasm/extended-const/extended-const.js
    A JSTests/wasm/extended-const/flag-turned-off.js
    M Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj
    M Source/JavaScriptCore/Sources.txt
    M Source/JavaScriptCore/runtime/OptionsList.h
    A Source/JavaScriptCore/wasm/WasmConstExprGenerator.cpp
    A Source/JavaScriptCore/wasm/WasmConstExprGenerator.h
    M Source/JavaScriptCore/wasm/WasmFormat.h
    M Source/JavaScriptCore/wasm/WasmFunctionParser.h
    M Source/JavaScriptCore/wasm/WasmModuleInformation.h
    M Source/JavaScriptCore/wasm/WasmParser.h
    M Source/JavaScriptCore/wasm/WasmSectionParser.cpp
    M Source/JavaScriptCore/wasm/WasmSectionParser.h
    M Source/JavaScriptCore/wasm/js/WebAssemblyModuleRecord.cpp
    M Source/JavaScriptCore/wasm/js/WebAssemblyModuleRecord.h
    M Tools/Scripts/run-jsc-stress-tests

  Log Message:
  -----------
  [wasm] Implement Extended Const Expressions
https://bugs.webkit.org/show_bug.cgi?id=252483

Reviewed by Justin Michaud and Yusuke Suzuki.

Enables the extended const expressions proposal, which allows i32.add, i32.sub,
i64.add, and i64.sub instructions in global, element, and data initialization
expressions. Since these instructions take arguments, the init expressions have
a tree structure and require a more complex evaluator with a stack.

The existing code paths for simple, one-instruction init expressions are kept
intact as fast paths. The general parsing case is only used if an `End`
instruction does not follow the first opcode and the proposal flag is on.

For extended expressions, a FunctionParser instance is used alongside a new
generator class for init expressions. The generator class will error on any
non-constant opcodes. The generator, when used in evaluation mode by module
initialization code paths, can also evaluate the constant expression.

At wasm module validation time, the extended expressions are only parsed and
validated. The binary opcodes for the expressions are then stored in
ModuleInformation, so that the module initialization step can evaluate them to
a wasm value.

This patch does not, however, generalize the parsing of element segment item
vectors. This can be done but requires some additional restructuring of element
segment representation.

Tests imported from the proposal spec repo are from commit
7612271a72f00e2b385a98a7f79a031f94fb77e6 of
https://github.com/WebAssembly/extended-const

* JSTests/wasm.yaml:
* JSTests/wasm/extended-const-spec-tests/data.wast.js: Added.
* JSTests/wasm/extended-const-spec-tests/elem.wast.js: Added.
* JSTests/wasm/extended-const-spec-tests/global.wast.js: Added.
* JSTests/wasm/extended-const/extended-const.js: Added.
(module):
(async testConstExprFastPaths):
(async testExtendedConstGlobal):
(async testExtendedConstElement):
(async testExtendedConstData):
(async testInvalidConstExprs):
* JSTests/wasm/extended-const/flag-turned-off.js: Added.
(module):
(async testConstExprErrorPaths):
* Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj:
* Source/JavaScriptCore/Sources.txt:
* Source/JavaScriptCore/runtime/OptionsList.h:
* Source/JavaScriptCore/wasm/WasmConstExprGenerator.cpp: Added.
(JSC::Wasm::ConstExprGenerator::ControlData::isIf):
(JSC::Wasm::ConstExprGenerator::ControlData::isTry):
(JSC::Wasm::ConstExprGenerator::ControlData::isAnyCatch):
(JSC::Wasm::ConstExprGenerator::ControlData::isCatch):
(JSC::Wasm::ConstExprGenerator::ControlData::isTopLevel):
(JSC::Wasm::ConstExprGenerator::ControlData::isLoop):
(JSC::Wasm::ConstExprGenerator::ControlData::isBlock):
(JSC::Wasm::ConstExprGenerator::ControlData::ControlData):
(JSC::Wasm::ConstExprGenerator::ControlData::signature const):
(JSC::Wasm::ConstExprGenerator::ControlData::branchTargetArity const):
(JSC::Wasm::ConstExprGenerator::ControlData::branchTargetType const):
(JSC::Wasm::ConstExprGenerator::emptyExpression):
(JSC::Wasm::ConstExprGenerator::fail const):
(JSC::Wasm::ConstExprGenerator::ConstExprGenerator):
(JSC::Wasm::ConstExprGenerator::result const):
(JSC::Wasm::ConstExprGenerator::setParser):
(JSC::Wasm::ConstExprGenerator::addArguments):
(JSC::Wasm::ConstExprGenerator::addConstant):
(JSC::Wasm::ConstExprGenerator::addLocal):
(JSC::Wasm::ConstExprGenerator::getGlobal):
(JSC::Wasm::ConstExprGenerator::addI32Add):
(JSC::Wasm::ConstExprGenerator::addI64Add):
(JSC::Wasm::ConstExprGenerator::addI32Sub):
(JSC::Wasm::ConstExprGenerator::addI64Sub):
(JSC::Wasm::ConstExprGenerator::addI32Mul):
(JSC::Wasm::ConstExprGenerator::addI64Mul):
(JSC::Wasm::ConstExprGenerator::addRefFunc):
(JSC::Wasm::ConstExprGenerator::addTopLevel):
(JSC::Wasm::ConstExprGenerator::endBlock):
(JSC::Wasm::ConstExprGenerator::endTopLevel):
(JSC::Wasm::ConstExprGenerator::notifyFunctionUsesSIMD):
(JSC::Wasm::ConstExprGenerator::dump):
(JSC::Wasm::ConstExprGenerator::willParseOpcode):
(JSC::Wasm::ConstExprGenerator::didParseOpcode):
(JSC::Wasm::ConstExprGenerator::didFinishParsingLocals):
(JSC::Wasm::ConstExprGenerator::didPopValueFromStack):
(JSC::Wasm::parseExtendedConstExpr):
(JSC::Wasm::evaluateExtendedConstExpr):
* Source/JavaScriptCore/wasm/WasmConstExprGenerator.h: Added.
* Source/JavaScriptCore/wasm/WasmFormat.h:
(JSC::Wasm::I32InitExpr::extendedExpression):
(JSC::Wasm::I32InitExpr::isExtendedExpression const):
(JSC::Wasm::I32InitExpr::constantExpressionIndex const):
* Source/JavaScriptCore/wasm/WasmFunctionParser.h:
(JSC::Wasm::FunctionParser<Context>::parseConstantExpression):
* Source/JavaScriptCore/wasm/WasmModuleInformation.h:
* Source/JavaScriptCore/wasm/WasmParser.h:
(JSC::Wasm::makeI32InitExpr):
* Source/JavaScriptCore/wasm/WasmSectionParser.cpp:
(JSC::Wasm::SectionParser::parseGlobal):
(JSC::Wasm::SectionParser::parseInitExpr):
(JSC::Wasm::SectionParser::parseI32InitExpr):
* Source/JavaScriptCore/wasm/WasmSectionParser.h:
* Source/JavaScriptCore/wasm/js/WebAssemblyModuleRecord.cpp:
(JSC::WebAssemblyModuleRecord::initializeExports):
(JSC::WebAssemblyModuleRecord::evaluateConstantExpression):
(JSC::WebAssemblyModuleRecord::evaluate):
* Source/JavaScriptCore/wasm/js/WebAssemblyModuleRecord.h:
* Tools/Scripts/run-jsc-stress-tests:

Canonical link: https://commits.webkit.org/267382@main


_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to