[GTK][JSCOnly] Enable WebAssembly on Linux environment
authorutatane.tea@gmail.com <utatane.tea@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 6 Mar 2017 15:43:30 +0000 (15:43 +0000)
committerutatane.tea@gmail.com <utatane.tea@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 6 Mar 2017 15:43:30 +0000 (15:43 +0000)
https://bugs.webkit.org/show_bug.cgi?id=164032

Reviewed by Michael Catanzaro.

.:

* Source/cmake/OptionsGTK.cmake:
* Source/cmake/OptionsJSCOnly.cmake:
* Source/cmake/OptionsMac.cmake:
* Source/cmake/WebKitFeatures.cmake:

Source/JavaScriptCore:

This patch enables WebAssembly on JSCOnly and GTK ports.
Basically, almost all the WASM code is portable to Linux.
One platform-dependent part is faster memory load using SIGBUS
signal handler. This patch ports this part to Linux.

* CMakeLists.txt:
* llint/LLIntSlowPaths.cpp:
(JSC::LLInt::LLINT_SLOW_PATH_DECL):
* wasm/WasmFaultSignalHandler.cpp:
(JSC::Wasm::trapHandler):
(JSC::Wasm::enableFastMemory):

Tools:

* Scripts/run-jsc-stress-tests:
Enable WASM tests.

* Scripts/webkitperl/FeatureList.pm:
Enable WebAssembly.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@213450 268f45cc-cd09-0410-ab3c-d52691b4dbfc

12 files changed:
ChangeLog
Source/JavaScriptCore/CMakeLists.txt
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/llint/LLIntSlowPaths.cpp
Source/JavaScriptCore/wasm/WasmFaultSignalHandler.cpp
Source/cmake/OptionsGTK.cmake
Source/cmake/OptionsJSCOnly.cmake
Source/cmake/OptionsMac.cmake
Source/cmake/WebKitFeatures.cmake
Tools/ChangeLog
Tools/Scripts/run-jsc-stress-tests
Tools/Scripts/webkitperl/FeatureList.pm

index 310aba5..29ce6e7 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2017-03-06  Yusuke Suzuki  <utatane.tea@gmail.com>
+
+        [GTK][JSCOnly] Enable WebAssembly on Linux environment
+        https://bugs.webkit.org/show_bug.cgi?id=164032
+
+        Reviewed by Michael Catanzaro.
+
+        * Source/cmake/OptionsGTK.cmake:
+        * Source/cmake/OptionsJSCOnly.cmake:
+        * Source/cmake/OptionsMac.cmake:
+        * Source/cmake/WebKitFeatures.cmake:
+
 2017-03-04  Michael Catanzaro  <mcatanzaro@igalia.com>
 
         Unreviewed, remove stray period from readme
index 9598c3e..af50c57 100644 (file)
@@ -928,6 +928,7 @@ set(JavaScriptCore_SOURCES
     wasm/WasmB3IRGenerator.cpp
     wasm/WasmBinding.cpp
     wasm/WasmCallingConvention.cpp
+    wasm/WasmFaultSignalHandler.cpp
     wasm/WasmFormat.cpp
     wasm/WasmMemory.cpp
     wasm/WasmMemoryInformation.cpp
@@ -938,6 +939,7 @@ set(JavaScriptCore_SOURCES
     wasm/WasmValidate.cpp
 
     wasm/js/JSWebAssemblyCallee.cpp
+    wasm/js/JSWebAssemblyCodeBlock.cpp
     wasm/js/JSWebAssemblyCompileError.cpp
     wasm/js/JSWebAssemblyInstance.cpp
     wasm/js/JSWebAssemblyLinkError.cpp
index 775bbbd..47d29c7 100644 (file)
@@ -1,3 +1,22 @@
+2017-03-06  Yusuke Suzuki  <utatane.tea@gmail.com>
+
+        [GTK][JSCOnly] Enable WebAssembly on Linux environment
+        https://bugs.webkit.org/show_bug.cgi?id=164032
+
+        Reviewed by Michael Catanzaro.
+
+        This patch enables WebAssembly on JSCOnly and GTK ports.
+        Basically, almost all the WASM code is portable to Linux.
+        One platform-dependent part is faster memory load using SIGBUS
+        signal handler. This patch ports this part to Linux.
+
+        * CMakeLists.txt:
+        * llint/LLIntSlowPaths.cpp:
+        (JSC::LLInt::LLINT_SLOW_PATH_DECL):
+        * wasm/WasmFaultSignalHandler.cpp:
+        (JSC::Wasm::trapHandler):
+        (JSC::Wasm::enableFastMemory):
+
 2017-03-06  Daniel Ehrenberg  <littledan@igalia.com>
 
         Currency digits calculation in Intl.NumberFormat should call out to ICU
index c68bace..b5095ff 100644 (file)
@@ -1499,6 +1499,7 @@ LLINT_SLOW_PATH_DECL(slow_path_handle_traps)
     LLINT_BEGIN_NO_SET_PC();
     ASSERT(vm.needTrapHandling());
     vm.handleTraps(exec);
+    UNUSED_PARAM(pc);
     LLINT_RETURN_TWO(throwScope.exception(), exec);
 }
 
index f46c5e6..0f1cbf7 100644 (file)
@@ -32,6 +32,7 @@
 #include "VM.h"
 #include "WasmExceptionType.h"
 
+#include <signal.h>
 #include <wtf/Lock.h>
 #include <wtf/NeverDestroyed.h>
 
@@ -43,21 +44,44 @@ static const bool verbose = false;
 }
 
 static struct sigaction oldSigBusHandler;
+static struct sigaction oldSigSegvHandler;
 static bool fastHandlerInstalled { false };
 static StaticLock codeLocationsLock;
 static LazyNeverDestroyed<HashSet<std::tuple<VM*, void*, void*>>> codeLocations; // (vm, start, end)
 
+// FIXME: Clean up mcontext_t handling code since it is scattered in heap/, tools/ and wasm/.
+// https://bugs.webkit.org/show_bug.cgi?id=169180
 #if CPU(X86_64)
+
+#if OS(DARWIN)
 #define InstructionPointerGPR context->__ss.__rip
 #define FirstArgumentGPR context->__ss.__rsi
+#elif OS(FREEBSD)
+#define InstructionPointerGPR context.mc_rip
+#define FirstArgumentGPR context.mc_rsi
+#elif defined(__GLIBC__)
+#define InstructionPointerGPR context.gregs[REG_RIP]
+#define FirstArgumentGPR context.gregs[REG_RSI]
+#endif
+
 #else
+
+#if OS(DARWIN)
 #define InstructionPointerGPR context->__ss.__pc
 #define FirstArgumentGPR context->__ss.__x[1]
+#elif OS(FREEBSD)
+#define InstructionPointerGPR context.mc_gpregs.gp_elr
+#define FirstArgumentGPR context.mc_gpregs.gp_x[1]
+#elif defined(__GLIBC__)
+#define InstructionPointerGPR context.pc
+#define FirstArgumentGPR context.regs[1]
+#endif
+
 #endif
 
 static void trapHandler(int signal, siginfo_t*, void* ucontext)
 {
-    mcontext_t context = static_cast<ucontext_t*>(ucontext)->uc_mcontext;
+    mcontext_t& context = static_cast<ucontext_t*>(ucontext)->uc_mcontext;
     void* faultingInstruction = reinterpret_cast<void*>(InstructionPointerGPR);
     dataLogLnIf(verbose, "starting handler for fault at: ", RawPointer(faultingInstruction));
 
@@ -89,7 +113,10 @@ static void trapHandler(int signal, siginfo_t*, void* ucontext)
     }
 
     // Since we only use fast memory in processes we control, if we restore we will just fall back to the default handler.
-    sigaction(signal, &oldSigBusHandler, nullptr);
+    if (signal == SIGBUS)
+        sigaction(signal, &oldSigBusHandler, nullptr);
+    else
+        sigaction(signal, &oldSigSegvHandler, nullptr);
 }
 
 void registerCode(VM& vm, void* start, void* end)
@@ -126,11 +153,19 @@ void enableFastMemory()
         sigfillset(&action.sa_mask);
         action.sa_flags = SA_SIGINFO;
         
-        if (!sigaction(SIGBUS, &action, &oldSigBusHandler)) {
-            fastHandlerInstalled = true;
-            codeLocations.construct();
-        }
-
+        // Installing signal handlers fails when
+        // 1. specificied sig is incorrect (invalid values or signal numbers which cannot be handled), or
+        // 2. second or third parameter points incorrect pointers.
+        // Thus, we must not fail in the following attempts.
+        int ret = 0;
+        ret = sigaction(SIGBUS, &action, &oldSigBusHandler);
+        ASSERT_UNUSED(ret, !ret);
+
+        ret = sigaction(SIGSEGV, &action, &oldSigSegvHandler);
+        ASSERT_UNUSED(ret, !ret);
+
+        codeLocations.construct();
+        fastHandlerInstalled = true;
     });
 }
     
index 27bf649..666af51 100644 (file)
@@ -73,12 +73,6 @@ if (NOT OPENGL_FOUND AND OPENGLES2_FOUND)
     set(ENABLE_GLES2_DEFAULT ON)
 endif ()
 
-if (WTF_CPU_X86_64)
-    set(ENABLE_FTL_DEFAULT ON)
-else ()
-    set(ENABLE_FTL_DEFAULT OFF)
-endif ()
-
 # Public options specific to the GTK+ port. Do not add any options here unless
 # there is a strong reason we should support changing the value of the option,
 # and the option is not relevant to any other WebKit ports.
@@ -160,7 +154,6 @@ WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_CSS_REGIONS PRIVATE ON)
 WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_CSS_SELECTORS_LEVEL4 PRIVATE ON)
 WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_DATABASE_PROCESS PRIVATE ON)
 WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_DOWNLOAD_ATTRIBUTE PRIVATE ON)
-WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_FTL_JIT PRIVATE ${ENABLE_FTL_DEFAULT})
 WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_FTPDIR PRIVATE OFF)
 WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_FULLSCREEN_API PRIVATE ON)
 WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_INDEXED_DATABASE PRIVATE ON)
index 53b4ee0..ad45a62 100644 (file)
@@ -9,7 +9,6 @@ set(PROJECT_VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_
 
 WEBKIT_OPTION_BEGIN()
 WEBKIT_OPTION_DEFINE(ENABLE_STATIC_JSC "Whether to build JavaScriptCore as a static library." PUBLIC OFF)
-WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_FTL_JIT PUBLIC ON)
 WEBKIT_OPTION_END()
 
 set(ALL_EVENT_LOOP_TYPES
index 4b55844..dcc60da 100644 (file)
@@ -107,7 +107,6 @@ WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_XSLT PRIVATE ON)
 WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_TOUCH_EVENTS PRIVATE OFF)
 
 WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_DEVICE_ORIENTATION PRIVATE OFF)
-WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_FTL_JIT PRIVATE ON)
 WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_GAMEPAD PRIVATE OFF)
 WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_IOS_AIRPLAY PRIVATE OFF)
 
index 3509633..9d55e78 100644 (file)
@@ -66,6 +66,8 @@ endmacro()
 macro(WEBKIT_OPTION_BEGIN)
     set(_SETTING_WEBKIT_OPTIONS TRUE)
 
+    set(ENABLE_FTL_DEFAULT ${WTF_CPU_X86_64})
+
     WEBKIT_OPTION_DEFINE(ENABLE_3D_TRANSFORMS "Toggle 3D transforms support" PRIVATE OFF)
     WEBKIT_OPTION_DEFINE(ENABLE_ACCELERATED_2D_CANVAS "Toggle accelerated 2D canvas support" PRIVATE OFF)
     WEBKIT_OPTION_DEFINE(ENABLE_ACCELERATED_OVERFLOW_SCROLLING "Toggle accelerated scrolling support" PRIVATE OFF)
@@ -106,7 +108,7 @@ macro(WEBKIT_OPTION_BEGIN)
     WEBKIT_OPTION_DEFINE(ENABLE_FILTERS_LEVEL_2 "Toggle Filters Module Level 2" PRIVATE OFF)
     WEBKIT_OPTION_DEFINE(ENABLE_FONT_LOAD_EVENTS "Toggle Font Load Events support" PRIVATE OFF)
     WEBKIT_OPTION_DEFINE(ENABLE_FTPDIR "Toggle FTP directory support" PRIVATE ON)
-    WEBKIT_OPTION_DEFINE(ENABLE_FTL_JIT "Toggle FTL support for JSC" PRIVATE OFF)
+    WEBKIT_OPTION_DEFINE(ENABLE_FTL_JIT "Toggle FTL support for JSC" PRIVATE ${ENABLE_FTL_DEFAULT})
     WEBKIT_OPTION_DEFINE(ENABLE_FULLSCREEN_API "Toggle Fullscreen API support" PRIVATE OFF)
     WEBKIT_OPTION_DEFINE(ENABLE_GAMEPAD "Toggle Gamepad support" PRIVATE OFF)
     WEBKIT_OPTION_DEFINE(ENABLE_GAMEPAD_DEPRECATED "Toggle deprecated Gamepad support" PRIVATE OFF)
@@ -181,7 +183,7 @@ macro(WEBKIT_OPTION_BEGIN)
     WEBKIT_OPTION_DEFINE(ENABLE_VIDEO "Toggle Video support" PRIVATE OFF)
     WEBKIT_OPTION_DEFINE(ENABLE_VIDEO_TRACK "Toggle Track support for HTML5 video" PRIVATE OFF)
     WEBKIT_OPTION_DEFINE(ENABLE_VIEW_MODE_CSS_MEDIA "Toggle Track support for the view-mode media Feature" PRIVATE ON)
-    WEBKIT_OPTION_DEFINE(ENABLE_WEBASSEMBLY "Toggle WebAssembly support" PRIVATE OFF)
+    WEBKIT_OPTION_DEFINE(ENABLE_WEBASSEMBLY "Toggle WebAssembly support" PRIVATE ${ENABLE_FTL_DEFAULT})
     WEBKIT_OPTION_DEFINE(ENABLE_WEBGL "Toggle WebGL support" PRIVATE OFF)
     WEBKIT_OPTION_DEFINE(ENABLE_WEBGL2 "Toggle WebGL 2.0 support" PRIVATE OFF)
     WEBKIT_OPTION_DEFINE(ENABLE_WEBGPU "Toggle WebGPU support" PRIVATE OFF)
@@ -200,6 +202,7 @@ macro(WEBKIT_OPTION_BEGIN)
     WEBKIT_OPTION_DEPEND(ENABLE_LEGACY_ENCRYPTED_MEDIA ENABLE_VIDEO)
     WEBKIT_OPTION_DEPEND(ENABLE_DFG_JIT ENABLE_JIT)
     WEBKIT_OPTION_DEPEND(ENABLE_FTL_JIT ENABLE_DFG_JIT)
+    WEBKIT_OPTION_DEPEND(ENABLE_WEBASSEMBLY ENABLE_FTL_JIT)
     WEBKIT_OPTION_DEPEND(ENABLE_SAMPLING_PROFILER ENABLE_JIT)
     WEBKIT_OPTION_DEPEND(ENABLE_INDEXED_DATABASE_IN_WORKERS ENABLE_INDEXED_DATABASE)
     WEBKIT_OPTION_DEPEND(ENABLE_MEDIA_CONTROLS_SCRIPT ENABLE_VIDEO)
index 6e28ea8..1ada24a 100644 (file)
@@ -1,3 +1,16 @@
+2017-03-06  Yusuke Suzuki  <utatane.tea@gmail.com>
+
+        [GTK][JSCOnly] Enable WebAssembly on Linux environment
+        https://bugs.webkit.org/show_bug.cgi?id=164032
+
+        Reviewed by Michael Catanzaro.
+
+        * Scripts/run-jsc-stress-tests:
+        Enable WASM tests.
+
+        * Scripts/webkitperl/FeatureList.pm:
+        Enable WebAssembly.
+
 2017-03-04  Lucas Forschler  <lforschler@apple.com>
 
         Test commit against svn.webkit.org after SHA-1 cleanup.
index 60afe6e..ed334d1 100755 (executable)
@@ -1176,10 +1176,6 @@ end
 def runWebAssembly
     return if !$jitTests
     return if !$isFTLPlatform
-    # FIXME: The current WebAssembly implementation includes Darwin specific things.
-    # Once WebAssembly becomes ready to be ported, we will enable it on the other OSes (like Linux) and drop this workaround.
-    # https://bugs.webkit.org/show_bug.cgi?id=164032
-    return if $hostOS != "darwin"
     modules = Dir[WASMTESTS_PATH + "*.js"].map { |f| File.basename(f) }
     prepareExtraAbsoluteFiles(WASMTESTS_PATH, ["wasm.json"])
     prepareExtraRelativeFiles(modules.map { |f| "../" + f }, $collection)
@@ -1194,10 +1190,6 @@ def runWebAssemblySpecTest(mode)
 
     return if !$jitTests
     return if !$isFTLPlatform
-    # FIXME: The current WebAssembly implementation includes Darwin specific things.
-    # Once WebAssembly becomes ready to be ported, we will enable it on the other OSes (like Linux) and drop this workaround.
-    # https://bugs.webkit.org/show_bug.cgi?id=164032
-    return if $hostOS != "darwin"
     modules = Dir[WASMTESTS_PATH + "*.js"].map { |f| File.basename(f) }
     prepareExtraAbsoluteFiles(WASMTESTS_PATH, ["wasm.json"])
     prepareExtraRelativeFiles(modules.map { |f| "../../" + f }, $collection)
index 6fbd838..b77e2a0 100644 (file)
@@ -225,7 +225,7 @@ my @features = (
       define => "ENABLE_FONT_LOAD_EVENTS", default => 0, value => \$fontLoadEventsSupport },
 
     { option => "ftl-jit", desc => "Toggle FTLJIT support",
-      define => "ENABLE_FTL_JIT", default => (isX86_64() && (isGtk() || isEfl())) , value => \$ftlJITSupport },
+      define => "ENABLE_FTL_JIT", default => (isX86_64() && (isGtk() || isJSCOnly())) , value => \$ftlJITSupport },
 
     { option => "ftpdir", desc => "Toggle FTP Directory support",
       define => "ENABLE_FTPDIR", default => 1, value => \$ftpDirSupport },
@@ -402,7 +402,7 @@ my @features = (
       define => "ENABLE_WEB_TIMING", default => 1, value => \$webTimingSupport },
 
     { option => "webassembly", desc => "Toggle WebAssembly support",
-      define => "ENABLE_WEBASSEMBLY", default => 0, value => \$webAssemblySupport },
+      define => "ENABLE_WEBASSEMBLY", default => (isX86_64() && (isGtk() || isJSCOnly())) , value => \$webAssemblySupport },
 
     { option => "webgl", desc => "Toggle WebGL support",
       define => "ENABLE_WEBGL", default => (isAppleCocoaWebKit() || isGtk() || isEfl()), value => \$webglSupport },