```bash
-cd WebKit-WebKit-7620.2.4.111.7
-env CFLAGS="-Wno-error=dangling-reference -Wno-dangling-reference" CXXFLAGS="-Wno-error=dangling-reference -Wno-dangling-reference" Tools/Scripts/build-webkit --jsc-only --cmakeargs="-Wno-error -DENABLE_STATIC_JSC=ON -DUSE_THIN_ARCHIVES=OFF -DCMAKE_C_FLAGS=\"-Wno-error -Wno-dangling-reference\" -DCMAKE_CXX_FLAGS=\"-Wno-error -Wno-dangling-reference\"" --make-args="-j1 -Wno-error -Wno-error=dangling-reference" -j1
+cd WebKit
+env CFLAGS="-Wno-error=all -Wno-error=volatile-register-var -Wno-dangling-reference" CXXFLAGS="-Wno-error=all -Wno-error=volatile-register-var -Wno-dangling-reference" Tools/Scripts/build-webkit --jsc-only --cmakeargs="-Wno-error=all -Wno-error=volatile-register-var -DENABLE_STATIC_JSC=ON -DUSE_THIN_ARCHIVES=OFF -DCMAKE_C_FLAGS=\"-Wno-error=all -Wno-error=volatile-register-var -Wno-dangling-reference\" -DCMAKE_CXX_FLAGS=\"-Wno-error=all -Wno-error=volatile-register-var \"" --make-args="-j1 -Wno-error=all -Wno-error=volatile-register-var " -j1
cd ..
```
@@ -540,9 +555,9 @@ When this was last tested on the Steam Deck, the build ran for 24 minutes!
:::
-:::danger pass
+:::note pass
-When this demo was last tested on ARM64, there was a dangling pointer error:
+In some test runs on AArch64 Linux, there was a dangling pointer error:
WebKitBuild/JSCOnly/Release/WTF/Headers/wtf/SentinelLinkedList.h:61:55: error: storing the address of local variable ‘toBeRemoved’ in ‘{"*"}MEM[(struct BasicRawSentinelNode {"*"} const &)this_4(D) + 96].WTF::BasicRawSentinelNode<JSC::CallLinkInfoBase>::m_next’ [-Werror=dangling-pointer=]
@@ -573,11 +588,56 @@ The error can be suppressed with preprocessor directives around the definition:
After patching the header, JSC must be built without WebAssembly or JIT support:
```bash
-cd WebKit-WebKit-7620.2.4.111.7
-env CFLAGS="-Wno-error=dangling-reference -Wno-dangling-reference" CXXFLAGS="-Wno-error=dangling-reference -Wno-dangling-reference" Tools/Scripts/build-webkit --jsc-only --cmakeargs="-Wno-error -DENABLE_STATIC_JSC=ON -DUSE_THIN_ARCHIVES=OFF -DCMAKE_C_FLAGS=\"-Wno-error -Wno-dangling-reference\" -DCMAKE_CXX_FLAGS=-Wno-error -Wno-dangling-reference" --make-args="-j1 -Wno-error -Wno-error=dangling-reference" -j1 --no-jit --no-webassembly
+cd WebKit
+env CFLAGS="-Wno-error=all -Wno-error=volatile-register-var -Wno-dangling-reference" CXXFLAGS="-Wno-error=all -Wno-error=volatile-register-var -Wno-dangling-reference" Tools/Scripts/build-webkit --jsc-only --cmakeargs="-Wno-error=all -Wno-error=volatile-register-var -DENABLE_STATIC_JSC=ON -DUSE_THIN_ARCHIVES=OFF -DCMAKE_C_FLAGS=\"-Wno-error=all -Wno-error=volatile-register-var -Wno-dangling-reference\" -DCMAKE_CXX_FLAGS=\"-Wno-error=all -Wno-error=volatile-register-var \"" --make-args="-j1 -Wno-error=all -Wno-error=volatile-register-var " -j1 --no-jit --no-webassembly
cd ..
```
+:::
+
+:::caution pass
+
+In some test runs, there was a register error:
+
+```
+WebKit/Source/JavaScriptCore/heap/MarkedBlock.cpp: In member function ‘void JSC::MarkedBlock::dumpInfoAndCrashForInvalidHandle(WTF::AbstractLocker&, JSC::HeapCell*)’:
+WebKit/Source/JavaScriptCore/heap/MarkedBlock.cpp:589:32: error: address of explicit register variable ‘savedActualVM’ requested
+ 589 | VMInspector::forEachVM([&](VM& vm) {
+ | ^~~~~~~~~~~~~
+ 590 | if (blockVM == &vm) {
+ | ~~~~~~~~~~~~~~~~~~~~~
+ 591 | isValidBlockVM = true;
+ | ~~~~~~~~~~~~~~~~~~~~~~
+ 592 | SAVE_TO_REG(savedActualVM, &vm);
+ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 593 | SAVE_TO_REG(savedBitfield, 8);
+ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 594 | LOG_INVALID_HANDLE_DETAILS("block VM %p is valid\n", &vm);
+ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 595 | return IterationStatus::Done;
+ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 596 | }
+ | ~
+ 597 | return IterationStatus::Continue;
+ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 598 | });
+ | ~
+```
+
+Until there is a proper upstream fix, the workaround is to explicitly no-op the
+`SAVE_TO_REG` macro in `MarkedBlock.cpp`:
+
+```diff title="WebKit/Source/JavaScriptCore/heap/MarkedBlock.cpp (remove red lines)"
+ #endif
+
+ #define SAVE_TO_REG(name, value) do { \
+- name = WTF::opaque(value); \
+- WTF::compilerFence(); \
+ } while (false)
+
+ NO_RETURN_DUE_TO_CRASH NEVER_INLINE void MarkedBlock::dumpInfoAndCrashForInvalidHandle(AbstractLocker&, HeapCell* heapCell)
+```
+
:::
@@ -586,7 +646,7 @@ cd ..
4) Create a symbolic link to the `Release` folder in the source tree:
```bash
-ln -s WebKit-WebKit-7620.2.4.111.7/WebKitBuild/JSCOnly/Release/ .
+ln -s WebKit/WebKitBuild/JSCOnly/Release .
```
5) Download [`sheetjs-jsc.c`](pathname:///jsc/sheetjs-jsc.c):
@@ -604,6 +664,18 @@ curl -LO https://docs.sheetjs.com/jsc/sheetjs-jsc.c
g++ -o sheetjs-jsc sheetjs-jsc.c -IRelease/JavaScriptCore/Headers -LRelease/lib -lbmalloc -licucore -lWTF -lJavaScriptCore -IRelease/JavaScriptCore/Headers -framework Foundation
```
+:::note pass
+
+In some test runs, there were `ld` warnings about `macOS` versions:
+
+```
+ld: warning: object file (Release/lib/libWTF.a[2](ASCIICType.cpp.o)) was built for newer 'macOS' version (14.5) than being linked (14.0)
+```
+
+These warnings can be ignored.
+
+:::
+