From b0dbe7dc433c6ccbbd10aa734f54155c871cc0a3 Mon Sep 17 00:00:00 2001 From: SheetJS Date: Sun, 14 Jul 2024 21:55:09 -0400 Subject: [PATCH] Windows ARM64 demo refresh --- docz/data/engines.xls | 4 +- docz/docs/03-demos/42-engines/20-chakra.md | 102 ++++++++++++++++++- docz/docs/03-demos/42-engines/26-jurassic.md | 1 + docz/static/favicon.ico | Bin 0 -> 34494 bytes 4 files changed, 100 insertions(+), 7 deletions(-) create mode 100644 docz/static/favicon.ico diff --git a/docz/data/engines.xls b/docz/data/engines.xls index ac6df1a..7ee0540 100644 --- a/docz/data/engines.xls +++ b/docz/data/engines.xls @@ -153,7 +153,7 @@ - + @@ -213,7 +213,7 @@ - + diff --git a/docz/docs/03-demos/42-engines/20-chakra.md b/docz/docs/03-demos/42-engines/20-chakra.md index 7450000..6945f75 100644 --- a/docz/docs/03-demos/42-engines/20-chakra.md +++ b/docz/docs/03-demos/42-engines/20-chakra.md @@ -135,6 +135,7 @@ This demo was tested in the following deployments: | `darwin-x64` | `c3ead3f` | 2024-03-15 | | `darwin-arm` | `3a7b120` | 2024-05-23 | | `win10-x64` | `c3ead3f` | 2024-03-04 | +| `win11-arm` | `13358c6` | 2024-07-14 | | `linux-x64` | `1f6e17c` | 2024-04-25 | ::: @@ -165,12 +166,20 @@ sudo pacman -S cmake clang ``` - + Install Visual Studio 2022 with the "Desktop Development with C++" workflow and the "Git for Windows" individual component. -All commands in this demo should be run in a "Native Tools Command Prompt". +The commands in this demo should be run in "Native Tools Command Prompt". + + + + +Install Visual Studio 2022 with the "Desktop Development with C++" workflow and +the "Git for Windows" individual component. + +The commands in this demo should be run in "ARM64 Native Tools Command Prompt". @@ -180,7 +189,7 @@ All commands in this demo should be run in a "Native Tools Command Prompt". ```bash git clone https://github.com/chakra-core/ChakraCore.git cd ChakraCore -git checkout 3a7b120 +git checkout 13358c6 cd .. ``` @@ -265,7 +274,7 @@ cd .. ``` - + :::info pass @@ -318,6 +327,57 @@ After building, the generated DLL should be copied into the project folder: ``` copy .\ChakraCore\Build\VcBuild\bin\x64_debug\ChakraCore.dll . +``` + + + + +:::info pass + +As explained in the ChakraCore project wiki[^1], the build accepts a few flags: + +- `/p:Platform=arm64` controls the architecture +- `/p:Configuration=Debug` enables runtime checks +- `/p:RuntimeLib=static_library` ensures MSVC libraries are statically linked + +::: + +``` +cd ChakraCore +msbuild /m /p:Platform=arm64 /p:Configuration=Debug /p:RuntimeLib=static_library Build\Chakra.Core.sln +cd .. +``` + +:::caution pass + +During some test runs, the build failed with a message referencing `LegalizeMD.cpp`: + +``` + ...\ChakraCore\lib\Backend\arm64\LegalizeMD.cpp(323,16): warning C1489: 'fPostRegAlloc': local variable is initialized but not referenced [...] +``` + +The source file `lib\Backend\arm64\LegalizeMD.cpp` must be patched. The +highlighted line must be commented: + +```cpp title="lib\Backend\arm64\LegalizeMD.cpp (comment highlighted line)" +void LegalizeMD::LegalizeIndirOffset(IR::Instr * instr, IR::IndirOpnd * indirOpnd, LegalForms forms) +{ +// highlight-next-line + //const bool fPostRegAlloc = instr->m_func->ShouldLegalizePostRegAlloc(); + + // For LEA, we have special handling of indiropnds + auto correctSize = [](IR::Instr* instr, IR::IndirOpnd* indirOpnd)#if defined(_UCRT) && _CONTROL_FLOW_GUARD +``` + +After commenting the line, run the command again. + +::: + + +After building, the generated DLL should be copied into the project folder: + +``` +copy .\ChakraCore\Build\VcBuild\bin\arm64_debug\ChakraCore.dll . ``` @@ -363,10 +423,23 @@ make + + + ``` cl sheetjs.ch.cpp ChakraCore.lib /I ChakraCore\lib\Jsrt /link /LIBPATH:ChakraCore\Build\VcBuild\bin\x64_debug ``` + + + +``` +cl sheetjs.ch.cpp ChakraCore.lib /I ChakraCore\lib\Jsrt /link /LIBPATH:ChakraCore\Build\VcBuild\bin\arm64_debug +``` + + + + @@ -411,7 +484,7 @@ If successful, the program will print the contents of the first sheet as CSV. :::note Tested Deployments -This demo was last tested on 2024-05-23 against `ch` commit `3a7b120`. +This demo was last tested on 2024-07-14 against `ch` commit `13358c6`. ::: @@ -474,10 +547,29 @@ cat global.js xlsx.full.min.js payload.js chakra.js > xlsx.chakra.js The final script defines `global` before loading the standalone library. Once ready, it will read the bundled test data and print the contents as CSV. +:::note pass + +On Windows, the command should be run in WSL. + +::: + 5) Run the script using the ChakraCore standalone binary: + + + ```bash ./ch xlsx.chakra.js ``` + + + +```bash +.\ch.exe xlsx.chakra.js +``` + + + + [^1]: See ["Building ChakraCore"](https://github.com/chakra-core/ChakraCore/wiki/Building-ChakraCore#deployment) in the ChakraCore project wiki \ No newline at end of file diff --git a/docz/docs/03-demos/42-engines/26-jurassic.md b/docz/docs/03-demos/42-engines/26-jurassic.md index 92a7c7f..a2315fc 100644 --- a/docz/docs/03-demos/42-engines/26-jurassic.md +++ b/docz/docs/03-demos/42-engines/26-jurassic.md @@ -179,6 +179,7 @@ This demo was tested in the following deployments: | `darwin-x64` | `3.2.7` | 2024-06-15 | | `darwin-arm` | `3.2.7` | 2024-06-15 | | `win10-x64` | `3.2.7` | 2024-06-21 | +| `win11-arm` | `3.2.7` | 2024-07-14 | | `linux-x64` | `3.2.7` | 2024-06-20 | | `linux-arm` | `3.2.7` | 2024-06-20 | diff --git a/docz/static/favicon.ico b/docz/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..302f67af7f1b15e5e453b18e0b15cce14ee81853 GIT binary patch literal 34494 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