Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
97 commits
Select commit Hold shift + click to select a range
5b35813
armv6m: initial commit of the assembler module
pguyot Aug 24, 2025
7796e5c
armv6m: initial backend commit
pguyot Aug 24, 2025
380d9ae
armv6m: implement shift left & shift right
pguyot Aug 24, 2025
a60ced4
armv6m: remove references to fpu registers
pguyot Aug 24, 2025
54d370e
armv6m: fix offsets to Context and JITState structs
pguyot Aug 24, 2025
cc72f96
armv6m: enable and fix move_to_cp_test
pguyot Aug 24, 2025
0caf0d5
armv6m: add jit_armv6m to nif_jit_backend_module
pguyot Aug 24, 2025
05e993e
armv6m: enable on Unix builds
pguyot Aug 24, 2025
b727f82
armv6m: enable on Pico builds
pguyot Aug 24, 2025
4457f95
armv6m: fix increment_sp
pguyot Aug 24, 2025
e43ede4
armv6m: move_array_element and get_array_element
pguyot Aug 24, 2025
416fdde
armv6m: move_to_array_element
pguyot Aug 24, 2025
df06fe0
armv6m: if_block
pguyot Aug 24, 2025
229aa66
armv6m: fix is_boolean_test
pguyot Aug 24, 2025
31e2d8d
armv6m: fix if_block & fix is_number_test
pguyot Aug 24, 2025
933834b
armv6m: fix is_integer_test and optimize implementation
pguyot Aug 24, 2025
9651706
armv6m: test comment after optimized is_number
pguyot Sep 20, 2025
f27fc7e
armv6m: fix get_list test
pguyot Aug 24, 2025
95d4759
armv6m: fix if_else_block_test
pguyot Aug 24, 2025
74e60ac
armv6m: fix mul
pguyot Aug 24, 2025
47d4c4f
armv6m: function call with stack parameters, WIP
pguyot Aug 25, 2025
dc2e79b
armv6m: fix and enable all disabled tests
pguyot Aug 26, 2025
c0a998d
armv6m: increase coverage & fix issues
pguyot Aug 26, 2025
0f69724
armv6m: add wait_timeout_test, fix continuation to offset
pguyot Aug 26, 2025
263be85
armv6m: fix OP_GC_BIF2 and return_labels_and_lines
pguyot Aug 27, 2025
f2249de
armv6m: fix mov_immediate with negative value and branch from set_con…
pguyot Aug 27, 2025
00f1fb2
armv6m: fix jump table to it works with labels beyond b range
pguyot Aug 28, 2025
b26f49e
armv6m: fix debugger function
pguyot Aug 28, 2025
15e1019
armv6m: move labels to backend states
pguyot Sep 20, 2025
46185d1
armv6m: optimize jump_to_label with known labels
pguyot Sep 20, 2025
c4e3023
armv6m: implement far branches
pguyot Aug 30, 2025
d34b8a0
armv6m: remove unused move_to_native_register/3 with fpu commented test
pguyot Aug 30, 2025
e820c6a
armv6m: implement term_to_float
pguyot Aug 30, 2025
74c1052
armv6m: fix and test add & sub
pguyot Aug 30, 2025
37ec447
armv6m: fix == with large immediate
pguyot Aug 30, 2025
97bc9b8
armv6m: fix stack alignment with calls
pguyot Aug 30, 2025
3db13ee
armv6m: fix issues with call_func_ptr and handle reg exhaustion
pguyot Aug 30, 2025
674d539
armv6m: fix issues with and_ reg exhaustion
pguyot Aug 31, 2025
3014b96
armv6m: fix cmp with large immediates
pguyot Aug 31, 2025
5aab974
armv6m: fix jump table to handle many labels
pguyot Aug 31, 2025
52d39d3
armv6m: fix jump table and stack calculations
pguyot Sep 1, 2025
0481e5a
armv6m: set the thumb bit on function pointers
pguyot Sep 1, 2025
ab38306
armv6m: fix function pointer calculations, first tests pass
pguyot Sep 1, 2025
053dc98
armv6m: fix tail call that shouldn't be a tail call
pguyot Sep 2, 2025
a31a0ba
armv6m: fix return lines and labels function
pguyot Sep 2, 2025
bee6118
armv6m: handle register exhaustion
pguyot Sep 2, 2025
5efea77
armv6m: precompile libraries
pguyot Sep 2, 2025
d2e6eb3
armv6m: fix far branches to set thumb bit
pguyot Sep 3, 2025
9d4dd0e
armv6m: minimal compilation for rp2 and stm32
pguyot Sep 3, 2025
0b35683
armv6m: fix compilation with large y_reg accesses, fix y_reg in args
pguyot Sep 3, 2025
c9fc019
armv6m: fix thumb bit in a long jump
pguyot Sep 4, 2025
5c1aa67
armv6m: fix offset calculation with set_continuation_to_label
pguyot Sep 4, 2025
4b28566
armv6m: fix reverse condition in if_block optimization
pguyot Sep 5, 2025
5959345
armv6m: fix offset in cp to jump table
pguyot Sep 7, 2025
2f9360b
armv6m: fix register usage with if_block_cond
pguyot Sep 7, 2025
3bc1de2
armv6m: add get_array_element with {free, Reg}
pguyot Sep 7, 2025
ecb6cae
armv6m: add move_to_native_register/2,3 with {x_reg, extra}
pguyot Sep 7, 2025
6d668cb
armv6m: fix register usage with get_module_index
pguyot Sep 7, 2025
a48a2f4
armv6m: fix branch target with call_only
pguyot Sep 9, 2025
539ed8c
armv6m: fix int64 arguments for 32 bits platforms
pguyot Sep 13, 2025
d809b75
armv6m: fix float registers
pguyot Sep 14, 2025
f6111a3
armv6m: fix register allocation when calling functions
pguyot Sep 16, 2025
5eaa412
armv6m: fix comment in static assert
pguyot Sep 17, 2025
aefbd90
armv6m: fix mvns encoding
pguyot Sep 17, 2025
63cd6c1
armv6m: use binutils helper for asm tests
pguyot Sep 17, 2025
2998842
armv6m: fix register parameters
pguyot Sep 19, 2025
125df6a
armv6m: fix result register bug
pguyot Sep 19, 2025
4827fb1
armv6m: pack uf2 binaries
pguyot Sep 19, 2025
22a9bb8
armv6m: add an assert for sizeof(size_t)
pguyot Sep 20, 2025
485f4d6
armv6m: Add target to test.c
pguyot Oct 12, 2025
9715d9f
armv6m: Fix offset for unaligned far branches
pguyot Sep 26, 2025
3639f6f
armv6m: Fix if_block test of equality of two free regs
pguyot Sep 28, 2025
8dcae31
armv6m: fix call to func ptr when registers are exhausted
pguyot Sep 28, 2025
208d025
armv6m: Run tests on armhf+jit
pguyot Oct 6, 2025
7509d31
armv6m: optimize and 0xFFFFFF
pguyot Sep 29, 2025
5088b64
JIT: bump timeout for test_jit.avm with valgrind
pguyot Oct 14, 2025
e1f4356
JIT: add float32 variant for single precision floats
pguyot Sep 20, 2025
4e7c382
JIT: optimize op return
pguyot Sep 21, 2025
4621b7d
JIT: optimize shift_right for platforms with 3 operands
pguyot Sep 29, 2025
f99f1dc
JIT: factorize tail calls to reduce binary size
pguyot Sep 29, 2025
933af32
armv6m: use literal pool to reduce binary size
pguyot Sep 29, 2025
f1ea329
riscv32: initial commit of asm module
pguyot Oct 4, 2025
2bedbdc
riscv32: initial backend implementation
pguyot Oct 5, 2025
cbe7b41
riscv32: add to workflow using temporary files
pguyot Oct 15, 2025
1cdf02d
riscv32: add to precompiled targets and test infrastructure
pguyot Oct 18, 2025
de2e4d3
JIT: Do not precompile pico libs if armv6m+float32 is not in precompi…
pguyot Oct 19, 2025
f58107a
riscv32: remove unused literal pool logic
pguyot Oct 19, 2025
a315bb7
Aarch64: add tests for better coverage
pguyot Oct 19, 2025
88c22fe
riscv32: fix several backend bugs
pguyot Oct 19, 2025
3f8f940
riscv32: fix compilation with JIT disabled on esp32
pguyot Oct 19, 2025
49c26b4
riscv32: enable JIT for pico2, add it to CI
pguyot Oct 21, 2025
03d4c83
Add missing define for HAVE_GETCWD for rp2
pguyot Oct 21, 2025
caff9a5
riscv32: Implement and use C extension
pguyot Oct 20, 2025
59723dc
JIT: Add DWARF support
pguyot Sep 7, 2025
75e515f
riscv32: Add DWARF support
pguyot Oct 18, 2025
abd9f48
dwarf: WIP
pguyot Oct 23, 2025
f81becf
dwarf: wip
pguyot Oct 23, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
101 changes: 98 additions & 3 deletions .github/workflows/build-and-test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -321,7 +321,7 @@ jobs:
cmake_opts_other: "-DAVM_DISABLE_JIT=OFF"
jit_target_arch: "aarch64"

# armhf build
# armhf builds
- os: "ubuntu-24.04"
cc: "arm-linux-gnueabihf-gcc"
cxx: "arm-linux-gnueabihf-g++"
Expand All @@ -336,6 +336,21 @@ jobs:
arch: "armhf"
library-arch: arm-linux-gnueabihf

- os: "ubuntu-24.04"
cc: "arm-linux-gnueabihf-gcc"
cxx: "arm-linux-gnueabihf-g++"
# -D_FILE_OFFSET_BITS=64 is required for making atomvm:posix_readdir/1 test work
# otherwise readdir will fail due to 64 bits inode numbers with 32 bit ino_t
cflags: "-mcpu=cortex-a7 -mfloat-abi=hard -O2 -mthumb -mthumb-interwork -D_FILE_OFFSET_BITS=64"
otp: "28"
elixir_version: "1.17"
rebar3_version: "3.24.0"
cmake_opts_other: "-DAVM_DISABLE_JIT=OFF -DAVM_JIT_TARGET_ARCH=armv6m -DCMAKE_TOOLCHAIN_FILE=${RUNNER_TEMP}/armhf_toolchain.cmake"
compiler_pkgs: "crossbuild-essential-armhf libc6-dbg:armhf zlib1g-dev:armhf libmbedtls-dev:armhf qemu-user qemu-user-binfmt binfmt-support"
arch: "armhf"
library-arch: arm-linux-gnueabihf
jit_target_arch: "armv6m"

# s390x build
- os: "ubuntu-24.04"
cc: "s390x-linux-gnu-gcc"
Expand All @@ -351,6 +366,19 @@ jobs:
arch: "s390x"
library-arch: s390x-linux-gnu

# riscv32-ilp32 build
- os: "ubuntu-24.04"
cc: "riscv32-unknown-linux-gnu-gcc"
cxx: "riscv32-unknown-linux-gnu-g++"
cflags: "-O2"
otp: "28"
elixir_version: "1.17"
rebar3_version: "3.24.0"
cmake_opts_other: "-DAVM_WARNINGS_ARE_ERRORS=ON -DCMAKE_TOOLCHAIN_FILE=${RUNNER_TEMP}/riscv32_ilp32_toolchain.cmake"
compiler_pkgs: "qemu-user qemu-user-binfmt binfmt-support"
arch: "riscv32"
library-arch: riscv32-linux-gnu-ilp32

env:
ImageOS: ${{ matrix.container == 'ubuntu:20.04' && 'ubuntu20' || matrix.os == 'ubuntu-20.04' && 'ubuntu20' || matrix.os == 'ubuntu-22.04' && 'ubuntu22' || matrix.os == 'ubuntu-24.04' && 'ubuntu24' || 'ubuntu24' }}
CC: ${{ matrix.cc }}
Expand All @@ -371,7 +399,7 @@ jobs:
run: sudo dpkg --add-architecture i386

- name: "Setup cross compilation architecture"
if: matrix.library-arch != ''
if: matrix.library-arch != '' && matrix.library-arch != 'riscv32-linux-gnu-ilp32'
run: |
sudo dpkg --add-architecture ${{ matrix.arch }}
cat > ${RUNNER_TEMP}/cross-compile-sources.list <<EOF
Expand All @@ -396,6 +424,73 @@ jobs:
set(MBEDTLS_LIBRARIES_DIR /usr/lib/${{ matrix.library-arch }})
EOF

- name: "Setup cross compilation architecture (riscv32)"
if: matrix.library-arch == 'riscv32-linux-gnu-ilp32'
run: |
sudo dpkg --add-architecture ${{ matrix.arch }}

# Download toolchain and libraries from release
gh release download riscv-toolchain-2025.10.18 \
-R pguyot/crossbuild-essential-riscv32 \
--pattern 'riscv32-gnu-toolchain-ilp32_2025.10.18_amd64.deb' \
--pattern 'libc6-ilp32_2.39-0ubuntu1_riscv32.deb' \
--pattern 'libc6-dev-ilp32_2.39-0ubuntu1_riscv32.deb' \
--pattern 'libc6-dbg-ilp32_2.39-0ubuntu1_riscv32.deb' \
--pattern 'zlib1g-ilp32_1.3.1-0ubuntu1_riscv32.deb' \
--pattern 'zlib1g-dev-ilp32_1.3.1-0ubuntu1_riscv32.deb' \
--pattern 'libmbedcrypto7-ilp32_2.28.8-0ubuntu1_riscv32.deb' \
--pattern 'libmbedtls-dev-ilp32_2.28.8-0ubuntu1_riscv32.deb' \
--pattern 'libmbedtls14-ilp32_2.28.8-0ubuntu1_riscv32.deb' \
--pattern 'libmbedx509-1-ilp32_2.28.8-0ubuntu1_riscv32.deb'

# Install the toolchain
sudo dpkg -i riscv32-gnu-toolchain-ilp32_2025.10.18_amd64.deb

# Add to PATH for all subsequent steps
echo "/opt/riscv32-ilp32/bin" >> $GITHUB_PATH

# Install the libs
sudo dpkg -i libc6-ilp32_2.39-0ubuntu1_riscv32.deb
sudo dpkg -i libc6-dev-ilp32_2.39-0ubuntu1_riscv32.deb
sudo dpkg -i libc6-dbg-ilp32_2.39-0ubuntu1_riscv32.deb

sudo dpkg -i zlib1g-ilp32_1.3.1-0ubuntu1_riscv32.deb
sudo dpkg -i zlib1g-dev-ilp32_1.3.1-0ubuntu1_riscv32.deb

sudo dpkg -i libmbedcrypto7-ilp32_2.28.8-0ubuntu1_riscv32.deb
sudo dpkg -i libmbedtls-dev-ilp32_2.28.8-0ubuntu1_riscv32.deb
sudo dpkg -i libmbedtls14-ilp32_2.28.8-0ubuntu1_riscv32.deb
sudo dpkg -i libmbedx509-1-ilp32_2.28.8-0ubuntu1_riscv32.deb

sudo sed -i '/Types: deb/a Architectures: amd64' /etc/apt/sources.list.d/ubuntu.sources

cat > ${RUNNER_TEMP}/${{ matrix.arch }}_toolchain.cmake <<EOF
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_C_LIBRARY_ARCHITECTURE ${{ matrix.library-arch }})

set(ZLIB_LIBRARY /usr/lib/${{ matrix.library-arch }}/libz.so)
set(ZLIB_INCLUDE_DIR /usr/riscv32-linux-gnu/include)

set(MBEDTLS_ROOT_DIR /usr)
set(MBEDTLS_LIBRARIES_DIR /usr/lib/${{ matrix.library-arch }})

include_directories(SYSTEM /usr/riscv32-linux-gnu/include)
EOF

# Set up qemu-user binfmt to find libraries
sudo ln -s /opt/riscv32-ilp32/sysroot/lib/ld-linux-riscv32-ilp32.so.1 /lib/ld-linux-riscv32-ilp32.so.1
sudo mkdir -p /usr/gnemul
sudo ln -s /opt/riscv32-ilp32/sysroot /usr/gnemul/qemu-riscv32

# Copy cross-compiled libraries to sysroot for qemu-user
sudo cp /usr/lib/${{ matrix.library-arch }}/libz.so.1* /opt/riscv32-ilp32/sysroot/lib/
sudo cp /usr/lib/${{ matrix.library-arch }}/libmbedtls.so.14 /opt/riscv32-ilp32/sysroot/lib/
sudo cp /usr/lib/${{ matrix.library-arch }}/libmbedcrypto.so.7 /opt/riscv32-ilp32/sysroot/lib/
sudo cp /usr/lib/${{ matrix.library-arch }}/libmbedx509.so.1 /opt/riscv32-ilp32/sysroot/lib/

env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

- name: "APT update"
run: sudo apt update -y

Expand Down Expand Up @@ -586,7 +681,7 @@ jobs:

- name: "Test: test_jit.avm with valgrind"
if: matrix.library-arch == '' && matrix.otp != '21' && matrix.otp != '22'
timeout-minutes: 30
timeout-minutes: 60
working-directory: build
run: |
ulimit -c unlimited
Expand Down
34 changes: 27 additions & 7 deletions .github/workflows/pico-build.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,17 @@ jobs:
strategy:
matrix:
board: ["pico", "pico_w", "pico2"]
platform: [""]
language: ["cpp"]
jit: ["", "-DAVM_DISABLE_JIT=OFF"]
include:
- board: "pico2"
platform: "-DPICO_PLATFORM=rp2350-riscv"
jit: ""

- board: "pico2"
platform: "-DPICO_PLATFORM=rp2350-riscv"
jit: "-DAVM_DISABLE_JIT=OFF"

steps:
- name: Checkout repo
Expand All @@ -57,6 +67,16 @@ jobs:
libnewlib-arm-none-eabi libstdc++-arm-none-eabi-newlib \
erlang-base erlang-dev erlang-dialyzer erlang-eunit rebar3

- name: Install riscv32 toolchain
if: matrix.platform == "-DPICO_PLATFORM=rp2350-riscv"
run: |
sudo mkdir -p /opt
cd /opt
sudo wget https://github.com/raspberrypi/pico-sdk-tools/releases/download/v2.2.0-3/riscv-toolchain-15-x86_64-lin.tar.gz
sudo tar xzf riscv-toolchain-15-x86_64-lin.tar.gz
ls /opt
echo "/opt/riscv-toolchain-15-x86_64-lin/bin" >> $GITHUB_PATH

- name: "Git config safe.directory for codeql"
run: git config --global --add safe.directory /__w/AtomVM/AtomVM

Expand All @@ -74,7 +94,7 @@ jobs:
set -euo pipefail
mkdir build
cd build
cmake .. -G Ninja -DPICO_BOARD=${{ matrix.board }}
cmake .. -G Ninja -DPICO_BOARD=${{ matrix.board }} ${{ matrix.platform }} ${{ matrix.jit }}
ninja

- name: "Perform CodeQL Analysis"
Expand All @@ -97,7 +117,7 @@ jobs:
mkdir build.nosmp
cd build.nosmp
# TODO: fix all warnings and enable -DAVM_WARNINGS_ARE_ERRORS=ON
cmake .. -G Ninja -DPICO_BOARD=${{ matrix.board }} -DAVM_DISABLE_SMP=1
cmake .. -G Ninja -DPICO_BOARD=${{ matrix.board }} ${{ matrix.jit }} -DAVM_DISABLE_SMP=1
cmake --build . --target=rp2_tests

- name: Run tests with rp2040js
Expand All @@ -112,7 +132,7 @@ jobs:
npx tsx run-tests.ts ../build.nosmp/tests/rp2_tests.uf2 ../build.nosmp/tests/test_erl_sources/rp2_test_modules.uf2

- name: Build atomvmlib.uf2
if: startsWith(github.ref, 'refs/tags/') && matrix.board != 'pico_w'
if: startsWith(github.ref, 'refs/tags/') && matrix.board != 'pico_w' && matrix.platform == '' && matrix.jit == ''
shell: bash
run: |
set -euo pipefail
Expand All @@ -122,7 +142,7 @@ jobs:
make atomvmlib-${{ matrix.board }}.uf2

- name: Rename AtomVM and write sha256sum
if: startsWith(github.ref, 'refs/tags/')
if: startsWith(github.ref, 'refs/tags/') && matrix.platform == '' && matrix.jit == ''
shell: bash
run: |
pushd src/platforms/rp2/build
Expand All @@ -137,7 +157,7 @@ jobs:
popd

- name: Rename atomvmlib and write sha256sum
if: startsWith(github.ref, 'refs/tags/') && matrix.board != 'pico_w'
if: startsWith(github.ref, 'refs/tags/') && matrix.board != 'pico_w' && matrix.platform == '' && matrix.jit == ''
shell: bash
run: |
pushd build/libs
Expand All @@ -148,7 +168,7 @@ jobs:

- name: Release (Pico & Pico2)
uses: softprops/action-gh-release@v1
if: startsWith(github.ref, 'refs/tags/') && matrix.board != 'pico_w'
if: startsWith(github.ref, 'refs/tags/') && matrix.board != 'pico_w' && matrix.platform == '' && matrix.jit == ''
with:
draft: true
fail_on_unmatched_files: true
Expand All @@ -160,7 +180,7 @@ jobs:

- name: Release (PicoW)
uses: softprops/action-gh-release@v1
if: startsWith(github.ref, 'refs/tags/') && matrix.board == 'pico_w'
if: startsWith(github.ref, 'refs/tags/') && matrix.board == 'pico_w' && matrix.platform == '' && matrix.jit == ''
with:
draft: true
fail_on_unmatched_files: true
Expand Down
7 changes: 5 additions & 2 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ option(AVM_DISABLE_SMP "Disable SMP." OFF)
option(AVM_DISABLE_TASK_DRIVER "Disable task driver support." OFF)
option(AVM_DISABLE_JIT "Disable just in time compilation." ON)
option(AVM_ENABLE_PRECOMPILED "Enable execution of precompiled code, even if JIT is disabled." OFF)
option(AVM_DISABLE_JIT_DWARF "Disable DWARF debug and profiling info for JIT." ON)
option(AVM_USE_32BIT_FLOAT "Use 32 bit floats." OFF)
option(AVM_VERBOSE_ABORT "Print module and line number on VM abort" OFF)
option(AVM_RELEASE "Build an AtomVM release" OFF)
Expand All @@ -57,12 +58,14 @@ if (NOT AVM_DISABLE_JIT AND NOT DEFINED AVM_JIT_TARGET_ARCH)
set(AVM_JIT_TARGET_ARCH ${CMAKE_SYSTEM_PROCESSOR})
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm64|aarch64$")
set(AVM_JIT_TARGET_ARCH "aarch64")
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^cortex-m.+$")
set(AVM_JIT_TARGET_ARCH "armv6m")
else()
message(FATAL "JIT is not supported on ${CMAKE_SYSTEM_PROCESSOR}")
message(FATAL_ERROR "JIT is not supported on ${CMAKE_SYSTEM_PROCESSOR}")
endif()
endif()

set(AVM_PRECOMPILED_TARGETS "x86_64;aarch64" CACHE STRING "Targets to precompile code to if AVM_DISABLE_JIT is OFF or AVM_ENABLE_PRECOMPILED is ON")
set(AVM_PRECOMPILED_TARGETS "x86_64;aarch64;armv6m;armv6m+float32;riscv32" CACHE STRING "Targets to precompile code to if AVM_DISABLE_JIT is OFF or AVM_ENABLE_PRECOMPILED is ON")

if((${CMAKE_SYSTEM_NAME} STREQUAL "Darwin") OR
(${CMAKE_SYSTEM_NAME} STREQUAL "Linux") OR
Expand Down
62 changes: 41 additions & 21 deletions CMakeModules/BuildErlang.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ macro(pack_archive avm_name)

set(multiValueArgs ERLC_FLAGS MODULES)
cmake_parse_arguments(PACK_ARCHIVE "" "" "${multiValueArgs}" ${ARGN})
list(JOIN PACK_ARCHIVE_ERLC_FLAGS " " PACK_ARCHIVE_ERLC_FLAGS)
foreach(module_name IN LISTS ${PACK_ARCHIVE_MODULES} PACK_ARCHIVE_MODULES PACK_ARCHIVE_UNPARSED_ARGUMENTS)
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/beams/${module_name}.beam
Expand Down Expand Up @@ -77,10 +76,13 @@ macro(pack_precompiled_archive avm_name)
else()
set(jit_deps "jit")
endif()
foreach(jit_target_arch ${AVM_PRECOMPILED_TARGETS})
foreach(jit_target_arch_variant ${AVM_PRECOMPILED_TARGETS})
set(pack_precompile_archive_${avm_name}_beams "")
# Extract base architecture for module dependencies
string(REGEX REPLACE "\\+.*$" "" jit_target_arch "${jit_target_arch_variant}")
set(jit_compiler_modules
${CMAKE_BINARY_DIR}/libs/jit/src/beams/jit.beam
${CMAKE_BINARY_DIR}/libs/jit/src/beams/jit_dwarf.beam
${CMAKE_BINARY_DIR}/libs/jit/src/beams/jit_precompile.beam
${CMAKE_BINARY_DIR}/libs/jit/src/beams/jit_stream_binary.beam
${CMAKE_BINARY_DIR}/libs/jit/src/beams/jit_${jit_target_arch}.beam
Expand All @@ -89,14 +91,14 @@ macro(pack_precompiled_archive avm_name)

foreach(module_name IN LISTS ${PACK_ARCHIVE_MODULES} PACK_ARCHIVE_MODULES PACK_ARCHIVE_UNPARSED_ARGUMENTS)
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/beams/${jit_target_arch}/${module_name}.beam
COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/beams/${jit_target_arch}/
&& erl -pa ${CMAKE_BINARY_DIR}/libs/jit/src/beams/ -noshell -s jit_precompile -s init stop -- ${jit_target_arch} ${CMAKE_CURRENT_BINARY_DIR}/beams/${jit_target_arch}/ ${CMAKE_CURRENT_BINARY_DIR}/beams/${module_name}.beam
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/beams/${jit_target_arch_variant}/${module_name}.beam
COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/beams/${jit_target_arch_variant}/
&& erl -pa ${CMAKE_BINARY_DIR}/libs/jit/src/beams/ -noshell -s jit_precompile -s init stop -- ${jit_target_arch_variant} ${CMAKE_CURRENT_BINARY_DIR}/beams/${jit_target_arch_variant}/ ${CMAKE_CURRENT_BINARY_DIR}/beams/${module_name}.beam
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/beams/${module_name}.beam ${jit_compiler_modules} ${jit_deps}
COMMENT "Compiling ${module_name}.beam to ${jit_target_arch}"
COMMENT "Compiling ${module_name}.beam to ${jit_target_arch_variant}"
VERBATIM
)
set(pack_precompile_archive_${avm_name}_beams ${pack_precompile_archive_${avm_name}_beams} ${CMAKE_CURRENT_BINARY_DIR}/beams/${jit_target_arch}/${module_name}.beam)
set(pack_precompile_archive_${avm_name}_beams ${pack_precompile_archive_${avm_name}_beams} ${CMAKE_CURRENT_BINARY_DIR}/beams/${jit_target_arch_variant}/${module_name}.beam)
endforeach()

if(AVM_RELEASE)
Expand All @@ -106,20 +108,20 @@ macro(pack_precompiled_archive avm_name)
endif()

add_custom_command(
OUTPUT ${avm_name}-${jit_target_arch}.avm
OUTPUT ${avm_name}-${jit_target_arch_variant}.avm
DEPENDS ${pack_precompile_archive_${avm_name}_beams} PackBEAM
COMMAND ${CMAKE_BINARY_DIR}/tools/packbeam/PackBEAM -a ${INCLUDE_LINES} ${avm_name}-${jit_target_arch}.avm ${pack_precompile_archive_${avm_name}_beams}
COMMENT "Packing archive ${avm_name}-${jit_target_arch}.avm"
COMMAND ${CMAKE_BINARY_DIR}/tools/packbeam/PackBEAM -a ${INCLUDE_LINES} ${avm_name}-${jit_target_arch_variant}.avm ${pack_precompile_archive_${avm_name}_beams}
COMMENT "Packing archive ${avm_name}-${jit_target_arch_variant}.avm"
VERBATIM
)
add_custom_target(
${avm_name}_${jit_target_arch} ALL
DEPENDS ${avm_name}-${jit_target_arch}.avm
${avm_name}_${jit_target_arch_variant} ALL
DEPENDS ${avm_name}-${jit_target_arch_variant}.avm
)
# Ensure source beams are built before precompilation
add_dependencies(${avm_name}_${jit_target_arch} ${avm_name}_emu)
add_dependencies(${avm_name}_${jit_target_arch_variant} ${avm_name}_emu)
# Make main target depend on precompiled targets
add_dependencies(${avm_name} ${avm_name}_${jit_target_arch})
add_dependencies(${avm_name} ${avm_name}_${jit_target_arch_variant})
endforeach()
endif()
endmacro()
Expand Down Expand Up @@ -159,23 +161,23 @@ macro(pack_lib avm_name)
set(target_deps ${avm_name}.avm)

if(NOT AVM_DISABLE_JIT OR AVM_ENABLE_PRECOMPILED)
foreach(jit_target_arch ${AVM_PRECOMPILED_TARGETS})
foreach(jit_target_arch_variant ${AVM_PRECOMPILED_TARGETS})
# Build JIT archives list for this specific target architecture
set(pack_lib_${avm_name}_jit_archives_${jit_target_arch} ${CMAKE_BINARY_DIR}/libs/jit/src/jit-${jit_target_arch}.avm)
set(pack_lib_${avm_name}_jit_archives_${jit_target_arch_variant} ${CMAKE_BINARY_DIR}/libs/jit/src/jit-${jit_target_arch_variant}.avm)
foreach(archive_name ${ARGN})
if(${archive_name} STREQUAL "estdlib")
set(pack_lib_${avm_name}_jit_archives_${jit_target_arch} ${pack_lib_${avm_name}_jit_archives_${jit_target_arch}} ${CMAKE_BINARY_DIR}/libs/${archive_name}/src/${archive_name}-${jit_target_arch}.avm)
set(pack_lib_${avm_name}_jit_archives_${jit_target_arch_variant} ${pack_lib_${avm_name}_jit_archives_${jit_target_arch_variant}} ${CMAKE_BINARY_DIR}/libs/${archive_name}/src/${archive_name}-${jit_target_arch_variant}.avm)
endif()
endforeach()

add_custom_command(
OUTPUT ${avm_name}-${jit_target_arch}.avm
OUTPUT ${avm_name}-${jit_target_arch_variant}.avm
DEPENDS ${pack_lib_${avm_name}_archive_targets} PackBEAM
COMMAND ${CMAKE_BINARY_DIR}/tools/packbeam/PackBEAM -a ${INCLUDE_LINES} ${avm_name}-${jit_target_arch}.avm ${pack_lib_${avm_name}_jit_archives_${jit_target_arch}} ${pack_lib_${avm_name}_archives}
COMMENT "Packing lib ${avm_name}-${jit_target_arch}.avm"
COMMAND ${CMAKE_BINARY_DIR}/tools/packbeam/PackBEAM -a ${INCLUDE_LINES} ${avm_name}-${jit_target_arch_variant}.avm ${pack_lib_${avm_name}_jit_archives_${jit_target_arch_variant}} ${pack_lib_${avm_name}_archives}
COMMENT "Packing lib ${avm_name}-${jit_target_arch_variant}.avm"
VERBATIM
)
set(target_deps ${target_deps} ${avm_name}-${jit_target_arch}.avm)
set(target_deps ${target_deps} ${avm_name}-${jit_target_arch_variant}.avm)
endforeach()
endif()
add_custom_command(
Expand All @@ -194,6 +196,24 @@ macro(pack_lib avm_name)
)
set(target_deps ${target_deps} ${avm_name}-pico.uf2 ${avm_name}-pico2.uf2)

if((NOT AVM_DISABLE_JIT OR AVM_ENABLE_PRECOMPILED) AND ("armv6m" IN_LIST AVM_PRECOMPILED_TARGETS OR "armv6m+float32" IN_LIST AVM_PRECOMPILED_TARGETS))
add_custom_command(
OUTPUT ${avm_name}-armv6m-pico.uf2
DEPENDS ${avm_name}-armv6m.avm UF2Tool
COMMAND ${CMAKE_BINARY_DIR}/tools/uf2tool/uf2tool create -o ${avm_name}-armv6m-pico.uf2 -s 0x10100000 ${avm_name}-armv6m.avm
COMMENT "Creating UF2 file ${avm_name}-armv6m.uf2"
VERBATIM
)
add_custom_command(
OUTPUT ${avm_name}-armv6m-pico2.uf2
DEPENDS ${avm_name}-armv6m.avm UF2Tool
COMMAND ${CMAKE_BINARY_DIR}/tools/uf2tool/uf2tool create -o ${avm_name}-armv6m-pico2.uf2 -f data -s 0x10100000 ${avm_name}-armv6m.avm
COMMENT "Creating UF2 file ${avm_name}-armv6m.uf2"
VERBATIM
)
set(target_deps ${target_deps} ${avm_name}-armv6m-pico.uf2 ${avm_name}-armv6m-pico2.uf2)
endif()

add_custom_target(
${avm_name} ALL
DEPENDS ${target_deps}
Expand Down
Loading