From b7dc284a9d0db12216966f192044753c933aee5f Mon Sep 17 00:00:00 2001 From: momo5502 Date: Wed, 9 Jul 2025 17:58:47 +0200 Subject: [PATCH] Memory 64 support --- .github/workflows/build.yml | 20 +++++++++++++++++--- page/package-lock.json | 9 ++++++++- page/package.json | 3 ++- page/public/emulator-worker.js | 15 ++++++++++++--- page/src/components/settings-menu.tsx | 13 +++++++++++++ page/src/emulator.ts | 5 +++-- page/src/playground.tsx | 9 +++++++++ page/src/settings.ts | 2 ++ 8 files changed, 66 insertions(+), 10 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index eb1315b3..e14e4482 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -170,6 +170,7 @@ jobs: - Android x86_64 - Android arm64-v8a - Emscripten Web + - Emscripten Web Memory 64 - Emscripten Node.js configuration: - Debug @@ -218,6 +219,9 @@ jobs: - platform: Emscripten Web runner: ubuntu-24.04 cmake-options: "-DMOMO_ENABLE_RUST_CODE=Off -DCMAKE_TOOLCHAIN_FILE=$(dirname $(which emcc))/cmake/Modules/Platform/Emscripten.cmake" + - platform: Emscripten Web Memory 64 + runner: ubuntu-24.04 + cmake-options: "-DMOMO_ENABLE_RUST_CODE=Off -DMOMO_EMSCRIPTEN_MEMORY64=On -DCMAKE_TOOLCHAIN_FILE=$(dirname $(which emcc))/cmake/Modules/Platform/Emscripten.cmake" - platform: Emscripten Node.js runner: ubuntu-24.04 cmake-options: "-DMOMO_EMSCRIPTEN_SUPPORT_NODEJS=On -DMOMO_ENABLE_RUST_CODE=Off -DCMAKE_TOOLCHAIN_FILE=$(dirname $(which emcc))/cmake/Modules/Platform/Emscripten.cmake" @@ -579,7 +583,13 @@ jobs: uses: pyTooling/download-artifact@v4 with: name: Emscripten Web Release Artifacts - path: build/release/artifacts + path: build/release/artifacts/32 + + - name: Download Emscripten Web Memory 64 Artifacts + uses: pyTooling/download-artifact@v4 + with: + name: Emscripten Web Memory 64 Release Artifacts + path: build/release/artifacts/64 - name: Download Windows Artifacts uses: pyTooling/download-artifact@v4 @@ -601,8 +611,12 @@ jobs: - name: Copy Files run: | - cp ./build/release/artifacts/analyzer.js ./page/public/ - cp ./build/release/artifacts/analyzer.wasm ./page/public/ + mkdir -p ./page/public/32/ + mkdir -p ./page/public/64/ + cp ./build/release/artifacts/32/analyzer.js ./page/public/32/ + cp ./build/release/artifacts/32/analyzer.wasm ./page/public/32/ + cp ./build/release/artifacts/64/analyzer.js ./page/public/64/ + cp ./build/release/artifacts/64/analyzer.wasm ./page/public/64/ - name: Build Page run: cd ./page && npm i && npm run build diff --git a/page/package-lock.json b/page/package-lock.json index 9088b2f2..0fff5aa2 100644 --- a/page/package-lock.json +++ b/page/package-lock.json @@ -40,7 +40,8 @@ "tailwind-merge": "^3.3.1", "tailwindcss": "^4.1.11", "tw-animate-css": "^1.3.4", - "vaul": "^1.1.2" + "vaul": "^1.1.2", + "wasm-feature-detect": "^1.8.0" }, "devDependencies": { "@eslint/js": "^9.30.0", @@ -5941,6 +5942,12 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/wasm-feature-detect": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/wasm-feature-detect/-/wasm-feature-detect-1.8.0.tgz", + "integrity": "sha512-zksaLKM2fVlnB5jQQDqKXXwYHLQUVH9es+5TOOHwGOVJOCeRBCiPjwSg+3tN2AdTCzjgli4jijCH290kXb/zWQ==", + "license": "Apache-2.0" + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/page/package.json b/page/package.json index c2c51ab7..833f6ed9 100644 --- a/page/package.json +++ b/page/package.json @@ -42,7 +42,8 @@ "tailwind-merge": "^3.3.1", "tailwindcss": "^4.1.11", "tw-animate-css": "^1.3.4", - "vaul": "^1.1.2" + "vaul": "^1.1.2", + "wasm-feature-detect": "^1.8.0" }, "devDependencies": { "@eslint/js": "^9.30.0", diff --git a/page/public/emulator-worker.js b/page/public/emulator-worker.js index b4184fa3..2e932278 100644 --- a/page/public/emulator-worker.js +++ b/page/public/emulator-worker.js @@ -9,7 +9,12 @@ onmessage = async (event) => { switch (data.message) { case "run": - runEmulation(payload.file, payload.options, payload.persist); + runEmulation( + payload.file, + payload.options, + payload.persist, + payload.wasm64, + ); break; case "event": msgQueue.push(payload); @@ -65,7 +70,7 @@ function getMessageFromQueue() { return msgQueue.shift(); } -function runEmulation(file, options, persist) { +function runEmulation(file, options, persist, wasm64) { const mainArguments = [...options, "-e", "./root", file]; globalThis.Module = { @@ -87,5 +92,9 @@ function runEmulation(file, options, persist) { postRun: flushLines, }; - importScripts("./analyzer.js"); + if (wasm64) { + importScripts("./64/analyzer.js"); + } else { + importScripts("./32/analyzer.js"); + } } diff --git a/page/src/components/settings-menu.tsx b/page/src/components/settings-menu.tsx index e49f6be0..a82f6478 100644 --- a/page/src/components/settings-menu.tsx +++ b/page/src/components/settings-menu.tsx @@ -6,6 +6,7 @@ import { Settings } from "@/settings"; interface SettingsMenuProps { settings: Settings; + allowWasm64: boolean; onChange: (settings: Settings) => void; } @@ -105,6 +106,18 @@ export class SettingsMenu extends React.Component { /> + +
+ { + this.setState({ wasm64: checked }); + }} + /> + +
); } diff --git a/page/src/emulator.ts b/page/src/emulator.ts index 26473b1f..2e8f0427 100644 --- a/page/src/emulator.ts +++ b/page/src/emulator.ts @@ -1,4 +1,4 @@ -import { createDefaultSettings, Settings, translateSettings } from "./settings"; +import { Settings, translateSettings } from "./settings"; import * as flatbuffers from "flatbuffers"; import * as fbDebugger from "@/fb/debugger"; @@ -84,7 +84,7 @@ export class Emulator { this.worker.onmessage = this._onMessage.bind(this); } - async start(settings: Settings = createDefaultSettings(), file: string) { + async start(settings: Settings, file: string) { this._setState(EmulationState.Running); this.worker.postMessage({ message: "run", @@ -92,6 +92,7 @@ export class Emulator { file, options: translateSettings(settings), persist: settings.persist, + wasm64: settings.wasm64, }, }); } diff --git a/page/src/playground.tsx b/page/src/playground.tsx index d318f6a3..6d80b59f 100644 --- a/page/src/playground.tsx +++ b/page/src/playground.tsx @@ -5,6 +5,8 @@ import { Output } from "@/components/output"; import { Emulator, EmulationState, isFinalState } from "./emulator"; import { Filesystem, setupFilesystem } from "./filesystem"; +import { memory64 } from "wasm-feature-detect"; + import "./App.css"; import { Popover, @@ -45,6 +47,7 @@ interface PlaygroundState { emulator: Emulator | null; application: string | undefined; drawerOpen: boolean; + allowWasm64: boolean; } function makePercentHandler( @@ -93,7 +96,12 @@ export class Playground extends React.Component< emulator: null, drawerOpen: false, application: undefined, + allowWasm64: false, }; + + memory64().then((allowWasm64) => { + this.setState({ allowWasm64 }); + }); } async resetFilesys() { @@ -272,6 +280,7 @@ export class Playground extends React.Component< { saveSettings(s); this.setState({ settings: s }); diff --git a/page/src/settings.ts b/page/src/settings.ts index d5ee492d..067edf3e 100644 --- a/page/src/settings.ts +++ b/page/src/settings.ts @@ -5,6 +5,7 @@ export interface Settings { bufferStdout: boolean; persist: boolean; execAccess: boolean; + wasm64: boolean; } export function createDefaultSettings(): Settings { @@ -15,6 +16,7 @@ export function createDefaultSettings(): Settings { bufferStdout: true, persist: false, execAccess: true, + wasm64: false, }; }