replace build.just with compile.pl

This commit is contained in:
2026-06-05 17:14:34 +02:00
parent 9c42618028
commit bd6df6b4e9
6 changed files with 563 additions and 756 deletions

160
flake.nix
View File

@ -6,6 +6,10 @@ rec {
flake-utils.url = "github:numtide/flake-utils";
};
# TODO: Merge wasm_host_pool/_allocator and use #define flags instead
# TODO: Rewrite all perl scripts -> modularize common code and unify menu actions
# TODO: Write a test suite that verifies the build process (against the produced .elf, check if the expected stuff is in there)
outputs =
{
self,
@ -259,147 +263,6 @@ rec {
'';
};
wamr_src = pkgs.fetchFromGitea {
domain = "gitea.local.chriphost.de";
owner = "christoph";
# domain = "git.cs.tu-dortmund.de";
# owner = "christoph.urlacher";
repo = "wamr";
# With mmap_space in .text.wamr_mmap
rev = "f618cfffaf5ac344fa39abcd16c35278cdacee15";
hash = "sha256-nOLQLIVImPoClGWvmqgMFeC8s5MHLzkTSl/M03eQDaA=";
# With fail_marker_group1 in wasm_set_exception_local
# rev = "177fe78618ce3f74ed497c13ea80e8fbad779e82";
# hash = "sha256-H+ubCmL1YkI7kG7pYBs1+vpROm0hy2sryi0MWeQO3Bs=";
# With mmap_space in .text.wamr_aot
# rev = "cda2009deb85511089b04b0ac736ad4da2d07e58";
# hash = "sha256-CN6xTiwzF4Jbrpf21TF5c/C03Xb3urwkibRuIXjoU/w=";
# Without mmap_space in .text.wamr_aot
# rev = "4e7aed33fe53bf3ee4a3f2fe582c74816f850759";
# hash = "sha256-/4BKwoFDRfkA+DmbWagxdtkCDAED5rxbz5e4xvjvVWU=";
};
wamr = stdenv.mkDerivation {
pname = "wamr";
version = "2.4.4";
src = wamr_src;
dontBuild = true;
installPhase = ''
runHook preInstall
mkdir -p $out
cp -rv ./* $out/
runHook postInstall
'';
};
mkLibiwasm =
{
buildenv,
platform,
buildtype,
cflags,
extraCmakeFlags ? [ ],
patches ? [ ],
}:
buildenv.mkDerivation {
pname = "libiwasm";
version = "2.4.4";
src = wamr_src;
inherit patches;
nativeBuildInputs = with pkgs; [ cmake ];
dontStrip = true;
cmakeBuildType = buildtype;
cmakeFlags = extraCmakeFlags ++ [
"-DCMAKE_VERBOSE_MAKEFILE=ON"
"-DCMAKE_COLOR_DIAGNOSTICS=ON"
"-DWAMR_BUILD_PLATFORM=${platform}"
"-DWAMR_BUILD_TARGET=X86_32"
"-DWAMR_BUILD_AOT=1"
"-DWAMR_BUILD_WAMR_COMPILER=0"
"-DWAMR_BUILD_INTERP=1"
"-DWAMR_BUILD_FAST_INTERP=0"
"-DWAMR_BUILD_JIT=0"
"-DWAMR_BUILD_FAST_JIT=0"
"-DWAMR_BUILD_LIBC_BUILTIN=1"
"-DWAMR_BUILD_LIBC_WASI=0"
"-DWAMR_BUILD_SIMD=0"
];
# Since GCC 15, implicit declarations are an error. Disable this.
NIX_CFLAGS_COMPILE = "-Wno-error=implicit-function-declaration " + cflags;
};
libiwasm-baremetal-mmap-debug = mkLibiwasm {
buildenv = i386_pkgs.stdenv;
platform = "baremetal";
buildtype = "Debug";
cflags = "-O0 -ggdb3";
extraCmakeFlags = [
"-DCMAKE_SYSTEM_NAME=Generic"
"-DCMAKE_SYSTEM_PROCESSOR=i386"
"-DCMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY"
];
};
libiwasm-baremetal-mmap-release = mkLibiwasm {
buildenv = i386_pkgs.stdenv;
platform = "baremetal";
buildtype = "MinSizeRel";
cflags = "-O2 -ggdb3 -DNDEBUG";
extraCmakeFlags = [
"-DCMAKE_SYSTEM_NAME=Generic"
"-DCMAKE_SYSTEM_PROCESSOR=i386"
"-DCMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY"
];
};
libiwasm-baremetal-debug = mkLibiwasm {
buildenv = i386_pkgs.stdenv;
platform = "baremetal";
buildtype = "Debug";
cflags = "-O0 -ggdb3";
patches = [ ./patches/disable_wamr_mmap.patch ];
extraCmakeFlags = [
"-DCMAKE_SYSTEM_NAME=Generic"
"-DCMAKE_SYSTEM_PROCESSOR=i386"
"-DCMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY"
];
};
libiwasm-baremetal-release = mkLibiwasm {
buildenv = i386_pkgs.stdenv;
platform = "baremetal";
buildtype = "MinSizeRel";
cflags = "-O2 -ggdb3 -DNDEBUG";
patches = [ ./patches/disable_wamr_mmap.patch ];
extraCmakeFlags = [
"-DCMAKE_SYSTEM_NAME=Generic"
"-DCMAKE_SYSTEM_PROCESSOR=i386"
"-DCMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY"
];
};
libiwasm-linux-debug = mkLibiwasm {
buildenv = pkgs.multiStdenv;
platform = "linux";
buildtype = "Debug";
cflags = "-O0 -ggdb3";
};
libiwasm-linux-release = mkLibiwasm {
buildenv = pkgs.multiStdenv;
platform = "linux";
buildtype = "MinSizeRel";
cflags = "-O2 -ggdb3 -DNDEBUG";
};
# ===========================================================================================
# Specify dependencies
# https://nixos.org/manual/nixpkgs/stable/#ssec-stdenv-dependencies-overview
@ -411,7 +274,7 @@ rec {
# - Setup hooks, for example makeWrapper/autoPatchelfHook
# - Interpreters needed by patchShebangs for build scripts (with the --build flag), which can be the case for e.g. perl
nativeBuildInputs = with pkgs; [
just
cmake
gdb
xxd
wabt
@ -525,19 +388,10 @@ rec {
# Dynamic libraries from buildinputs:
# LD_LIBRARY_PATH = pkgs.lib.makeLibraryPath buildInputs;
JUST_WORKING_DIRECTORY = "/home/christoph/Notes/TU/MastersThesis/FailNix";
JUST_JUSTFILE = "/home/christoph/Notes/TU/MastersThesis/FailNix/scripts/build.just";
# Those are read by the justfile
# Those are read by compile.pl / build.pl
FAIL_SHARE = "${fail-bin}/share";
WASI_ROOT = wasi-sdk;
WAMR_ROOT = wamr;
LIBIWASM_DEBUG = "${libiwasm-baremetal-debug}/lib";
LIBIWASM_RELEASE = "${libiwasm-baremetal-release}/lib";
LIBIWASM_MMAP_DEBUG = "${libiwasm-baremetal-mmap-debug}/lib";
LIBIWASM_MMAP_RELEASE = "${libiwasm-baremetal-mmap-release}/lib";
LIBIWASM_LINUX_DEBUG = "${libiwasm-linux-debug}/lib";
LIBIWASM_LINUX_RELEASE = "${libiwasm-linux-release}/lib";
WAMR_ROOT = "/home/christoph/Notes/TU/MastersThesis/FailNix/wamr";
CROSS_CC = "${i386_pkgs.stdenv.cc}/bin/i386-elf-gcc";
CROSS_CXX = "${i386_pkgs.stdenv.cc}/bin/i386-elf-g++";
LINUX_CC = "${pkgs.multiStdenv.cc}/bin/gcc";

View File

@ -49,6 +49,29 @@ sub date_now {
return $date;
}
sub run {
my @cmd = @_;
say " + @cmd";
system(@cmd) == 0
or die "Command failed (exit " . ( $? >> 8 ) . "): @cmd\n";
}
sub read_file {
my ($file) = @_;
open( my $readhandle, '<', $file ) or die "failed to open $file: $!";
local $/;
my $content = <$readhandle> // die "failed to read $file: $!";
close($readhandle) or die "failed to close $file: $!";
return $content;
}
sub write_file {
my ( $file, $content ) = @_;
open( my $writehandle, '>', $file ) or die "failed to open $file: $!";
print $writehandle $content or die "failed to write $file: $!";
close($writehandle) or die "failed to close $file: $!";
}
sub rewrite_file {
my ( $file, $matches, $replacement ) = @_;

View File

@ -1,480 +0,0 @@
BUILD_DIR := "build"
# Load environment variables set by "nix develop"-shell
WASI_ROOT := env("WASI_ROOT")
WAMR_ROOT := env("WAMR_ROOT")
LIBIWASM_DEBUG := env("LIBIWASM_DEBUG")
LIBIWASM_RELEASE := env("LIBIWASM_RELEASE")
LIBIWASM_MMAP_DEBUG := env("LIBIWASM_MMAP_DEBUG")
LIBIWASM_MMAP_RELEASE := env("LIBIWASM_MMAP_RELEASE")
LIBIWASM_LINUX_DEBUG := env("LIBIWASM_LINUX_DEBUG")
LIBIWASM_LINUX_RELEASE := env("LIBIWASM_LINUX_RELEASE")
CROSS_CC := env("CROSS_CC")
LINUX_CC := env("LINUX_CC")
WAMR_USE_AOT_SECTION := env_var_or_default("WAMR_USE_AOT_SECTION", "false")
# =================================================================================================================== #
# Helper recipes
# =================================================================================================================== #
[default]
[private]
list:
@just --list
[private]
create-build-dir module:
mkdir -p {{ BUILD_DIR }}-{{ module }}
[doc("Delete the build directory")]
clean module:
rm -rf {{ BUILD_DIR }}-{{ module }}
# =================================================================================================================== #
# Just do it
# =================================================================================================================== #
# Somehow this breaks the syntax highlighting:
# [arg("mode", pattern="c|aot|interp", help="Which WASM mode to use")]
# [arg("target", pattern="fail|linux|linux-baremetal", help="Which platform to compile for")]
[doc("Perform all steps for a fail/linux/linux-bm build with aot/interp WASM")]
[group("5: just do it")]
build module="__help" target="fail" mode="aot":
#!/usr/bin/env sh
if [ "{{ module }}" = "__help" ]; then
just --usage build
exit 0
fi
just clean {{ module }}
just create-build-dir {{ module }}
just copy-auxiliary {{ module }}
if [ "{{ mode }}" = "aot" ]; then
just build-wasm-module {{ module }}
just build-wasm-aot {{ module }} {{ target }}
just build-wasm-aot-array {{ module }}
just prepare-aot-host {{ module }}
just build-wasm-host {{ module }} {{ target }}
just build-system-startup {{ module }} {{ target }}
just build-system-syscalls {{ module }} {{ target }}
just link-system {{ module }} {{ target }}
elif [ "{{ mode }}" = "interp" ]; then
just build-wasm-module {{ module }}
just build-wasm-interp-array {{ module }}
just prepare-interp-host {{ module }}
just build-wasm-host {{ module }} {{ target }}
just build-system-startup {{ module }} {{ target }}
just build-system-syscalls {{ module }} {{ target }}
just link-system {{ module }} {{ target }}
elif [ "{{ mode }}" = "c" ]; then
just build-c-module {{ module }} {{ target }}
just build-c-host {{ module }} {{ target }}
just build-system-startup {{ module }} {{ target }}
just link-c-system {{ module }} {{ target }}
else
echo "unknown mode: {{ mode }}" >&2
exit 1
fi
just build-iso {{ module }}
# =================================================================================================================== #
# Build WASM module recipes
# =================================================================================================================== #
WASI_CC := f"{{WASI_ROOT}}/bin/clang"
WASI_CFLAGS := "\
--target=wasm32 \
--sysroot={{WASI_ROOT}}/share/wasi-sysroot \
-z stack-size=4096 \
-O0 \
-nostdlib \
-Wl,--no-entry \
-Wl,--export=wasm_module \
-Wl,--no-gc-sections \
-Wl,--initial-memory=65536 \
-Wl,--export=__heap_base \
-Wl,--export=__data_end \
"
CROSS_CFLAGS_NOWASM := "\
-O0 \
-m32 \
-ffunction-sections \
-fdata-sections \
-ffreestanding \
-fpermissive \
-ggdb3 \
"
CROSS_LDFLAGS_NOWASM := "\
-Wl,--build-id=none \
-static \
-nostdlib \
-m32 \
-lc \
-lgcc \
-lm \
"
LINUX_CFLAGS_NOWASM := "\
-O0 \
-m32 \
-ffunction-sections \
-fdata-sections \
-fpermissive \
-ggdb3 \
"
LINUX_LDFLAGS_NOWASM := "\
-Wl,--build-id=none \
-m32 \
-lm \
"
WAMRC := "wamrc"
WAMR_USE_XIP := env("WAMR_USE_XIP", "false")
CROSS_WAMRCFLAGS := "\
--target=i386 \
--cpu=generic \
--opt-level=0 \
" + if WAMR_USE_XIP == "true" { "--xip" } else { "" }
LINUX_WAMRCFLAGS := "\
--target=i386 \
--cpu=generic \
--opt-level=0 \
"
XXD := "xxd"
[doc("C -> WASM: Compile a C function to a WASM module using WASI-SDK")]
[group("1: build module")]
build-wasm-module module:
{{ WASI_CC }} {{ WASI_CFLAGS }} targets/wasm-module/{{ module }}.cpp -o {{ BUILD_DIR }}-{{ module }}/wasm_module.wasm
[private]
build-wasm-aot-linux module:
{{ WAMRC }} {{ LINUX_WAMRCFLAGS }} -o {{ BUILD_DIR }}-{{ module }}/wasm_module.aot {{ BUILD_DIR }}-{{ module }}/wasm_module.wasm
[private]
build-wasm-aot-cross module:
{{ WAMRC }} {{ CROSS_WAMRCFLAGS }} -o {{ BUILD_DIR }}-{{ module }}/wasm_module.aot {{ BUILD_DIR }}-{{ module }}/wasm_module.wasm
[doc("WASM -> AOT: Compile a WASM module ahead-of-time using WAMR")]
[group("1: build module")]
build-wasm-aot module target="fail":
#!/usr/bin/env sh
if [ "{{ target }}" = "fail" ]; then
just build-wasm-aot-cross "{{ module }}"
elif [ "{{ target }}" = "linux" ]; then
just build-wasm-aot-linux "{{ module }}"
elif [ "{{ target }}" = "linux-baremetal" ]; then
just build-wasm-aot-cross "{{ module }}"
else
echo "unknown target: {{ target }}" >&2
exit 1
fi
[doc("AOT -> C-Array: Dump a WASM module compiled ahead-of-time to a binary array")]
[group("1: build module")]
build-wasm-aot-array module:
{{ XXD }} -i {{ BUILD_DIR }}-{{ module }}/wasm_module.aot > {{ BUILD_DIR }}-{{ module }}/wasm_aot_array.c
if [ "{{ WAMR_USE_AOT_SECTION }}" = "true" ]; then \
sed -i '1s/^/__attribute__((section(".text.wamr_aot"), aligned(4096)))\n/' {{ BUILD_DIR }}-{{ module }}/wasm_aot_array.c; \
fi
[doc("WASM -> C-Array: Dump a WASM module to a binary array")]
[group("1: build module")]
build-wasm-interp-array module:
{{ XXD }} -i {{ BUILD_DIR }}-{{ module }}/wasm_module.wasm > {{ BUILD_DIR }}-{{ module }}/wasm_interp_array.c
[private]
build-c-module-fail module:
{{ CROSS_CC }} {{ CROSS_CFLAGS_NOWASM }} \
-c targets/wasm-module/{{ module }}.cpp \
-o {{ BUILD_DIR }}-{{ module }}/c_module.o
[private]
build-c-module-linux module:
{{ LINUX_CC }} {{ LINUX_CFLAGS_NOWASM }} \
-c targets/wasm-module/{{ module }}.cpp \
-o {{ BUILD_DIR }}-{{ module }}/c_module.o
[doc("C -> Object: Compile a C function (no WASM)")]
[group("1: build module")]
build-c-module module target="fail":
#!/usr/bin/env sh
if [ "{{ target }}" = "fail" ]; then
just build-c-module-fail "{{ module }}"
elif [ "{{ target }}" = "linux" ]; then
just build-c-module-linux "{{ module }}"
else
echo "unknown target: {{ target }}" >&2
exit 1
fi
[private]
copy-auxiliary module:
cp flake.nix {{ BUILD_DIR }}-{{ module }}/flake.nix
cp scripts/runner.pl {{ BUILD_DIR }}-{{ module }}/runner.pl
cp scripts/build.just {{ BUILD_DIR }}-{{ module }}/wasm.just
cp targets/lib.h {{ BUILD_DIR }}-{{ module }}/lib.h
cp targets/linker.ld {{ BUILD_DIR }}-{{ module }}/linker.ld
cp targets/startup.s {{ BUILD_DIR }}-{{ module }}/startup.s
cp targets/syscalls.c {{ BUILD_DIR }}-{{ module }}/syscalls.c
cp targets/wasm-module/{{ module }}.cpp {{ BUILD_DIR }}-{{ module }}/wasm-module.cpp
# =================================================================================================================== #
# Host program recipes
# =================================================================================================================== #
# FAIL*
WAMR_USE_MMAP := env("WAMR_USE_MMAP", "false")
ACTIVE_LIBIWASM_DEBUG := if WAMR_USE_MMAP == "true" { LIBIWASM_MMAP_DEBUG } else { LIBIWASM_DEBUG }
CROSS_CFLAGS := f"-I./targets/wasm-host {{CROSS_CFLAGS_NOWASM}}"
CROSS_LDFLAGS := f"-L{{ACTIVE_LIBIWASM_DEBUG}} -liwasm {{CROSS_LDFLAGS_NOWASM}}"
CROSS_INCLUDES := f"\
-I{{WAMR_ROOT}}/core/iwasm/include \
-I{{WAMR_ROOT}}/core/shared/utils \
-I{{WAMR_ROOT}}/core/shared/platform/baremetal \
"
# LINUX-POSIX
LINUX_CFLAGS := f"-I./targets/wasm-host {{LINUX_CFLAGS_NOWASM}}"
LINUX_LDFLAGS := f"-Wl,-rpath,{{LIBIWASM_LINUX_DEBUG}} -L{{LIBIWASM_LINUX_DEBUG}} -liwasm {{LINUX_LDFLAGS_NOWASM}}"
LINUX_INCLUDES := f"\
-I{{WAMR_ROOT}}/core/iwasm/include \
-I{{WAMR_ROOT}}/core/shared/utils \
-I{{WAMR_ROOT}}/core/shared/platform/linux \
"
# LINUX-Baremetal
LINUX_BAREMETAL_CFLAGS := "\
-I./targets/wasm-host \
-O0 \
-m32 \
-ffunction-sections \
-fdata-sections \
-ffreestanding \
-ggdb3 \
"
LINUX_BAREMETAL_LDFLAGS := f"\
-Wl,--build-id=none \
-static \
-nostdlib \
-m32 \
-L{{ACTIVE_LIBIWASM_DEBUG}} \
-liwasm \
-lc \
-lgcc \
-lm \
--entry main \
"
LINUX_BAREMETAL_INCLUDES := f"\
-I{{WAMR_ROOT}}/core/iwasm/include \
-I{{WAMR_ROOT}}/core/shared/utils \
-I{{WAMR_ROOT}}/core/shared/platform/baremetal \
"
[doc("Insert the AOT array into the host program")]
[group("2: build host")]
prepare-aot-host module:
cp targets/wasm-host/wasm_host.c {{ BUILD_DIR }}-{{ module }}/module_host.c
sed -i \
-e "s/__WASM_ARRAY_FILE__/wasm_aot_array.c/g" \
-e "s/__WASM_ARRAY__/build_{{ module }}_wasm_module_aot/g" \
-e "s/__WASM_ARRAY_LEN__/build_{{ module }}_wasm_module_aot_len/g" \
{{ BUILD_DIR }}-{{ module }}/module_host.c
[doc("Insert the WASM array into the host program")]
[group("2: build host")]
prepare-interp-host module:
cp targets/wasm-host/wasm_host.c {{ BUILD_DIR }}-{{ module }}/module_host.c
sed -i \
-e "s/__WASM_ARRAY_FILE__/wasm_interp_array.c/g" \
-e "s/__WASM_ARRAY__/build_{{ module }}_wasm_module_wasm/g" \
-e "s/__WASM_ARRAY_LEN__/build_{{ module }}_wasm_module_wasm_len/g" \
{{ BUILD_DIR }}-{{ module }}/module_host.c
[private]
build-wasm-host-fail module:
{{ CROSS_CC }} {{ CROSS_CFLAGS }} {{ CROSS_INCLUDES }} \
-DTARGET_FAIL \
-c {{ BUILD_DIR }}-{{ module }}/module_host.c \
-o {{ BUILD_DIR }}-{{ module }}/system.o
[private]
build-wasm-host-linux module:
{{ LINUX_CC }} {{ LINUX_CFLAGS }} {{ LINUX_INCLUDES }} \
-DTARGET_LINUX \
-c {{ BUILD_DIR }}-{{ module }}/module_host.c \
-o {{ BUILD_DIR }}-{{ module }}/system.o
[private]
build-wasm-host-linux-baremetal module:
{{ CROSS_CC }} {{ LINUX_BAREMETAL_CFLAGS }} {{ LINUX_BAREMETAL_INCLUDES }} \
-DTARGET_LINUX_BAREMETAL \
-c {{ BUILD_DIR }}-{{ module }}/module_host.c \
-o {{ BUILD_DIR }}-{{ module }}/system.o
[doc("Compile C-Host: The host uses WAMR to load the WASM/AOT module")]
[group("2: build host")]
build-wasm-host module target="fail":
#!/usr/bin/env sh
if [ "{{ target }}" = "fail" ]; then
just build-wasm-host-fail "{{ module }}"
elif [ "{{ target }}" = "linux" ]; then
just build-wasm-host-linux "{{ module }}"
elif [ "{{ target }}" = "linux-baremetal" ]; then
just build-wasm-host-linux-baremetal "{{ module }}"
else
echo "unknown target: {{ target }}" >&2
exit 1
fi
[private]
build-c-host-fail module:
{{ CROSS_CC }} {{ CROSS_CFLAGS_NOWASM }} \
-DTARGET_FAIL \
-c targets/c-host/c_host.c \
-o {{ BUILD_DIR }}-{{ module }}/c_host.o
[private]
build-c-host-linux module:
{{ LINUX_CC }} {{ LINUX_CFLAGS_NOWASM }} \
-DTARGET_LINUX \
-c targets/c-host/c_host.c \
-o {{ BUILD_DIR }}-{{ module }}/c_host.o
[doc("Insert the C function into the host program (no WASM)")]
[group("2: build host")]
build-c-host module target="fail":
#!/usr/bin/env sh
if [ "{{ target }}" = "fail" ]; then
just build-c-host-fail "{{ module }}"
elif [ "{{ target }}" = "linux" ]; then
just build-c-host-linux "{{ module }}"
else
echo "unknown target: {{ target }}" >&2
exit 1
fi
cp targets/c-host/c_host.c {{ BUILD_DIR }}-{{ module }}/module_host.c
[private]
build-system-startup-fail module:
{{ CROSS_CC }} targets/startup.s {{ CROSS_CFLAGS }} -c -o {{ BUILD_DIR }}-{{ module }}/startup.o
[doc("Compile bootloader")]
[group("2: build host")]
build-system-startup module target="fail":
#!/usr/bin/env sh
if [ "{{ target }}" = "fail" ]; then
just build-system-startup-fail "{{ module }}"
else
echo "{{ target }} doesn't need bootloader"
fi
[private]
build-system-syscalls-fail module:
{{ CROSS_CC }} targets/syscalls.c {{ CROSS_CFLAGS }} -c -o {{ BUILD_DIR }}-{{ module }}/syscalls.o
[private]
build-system-syscalls-linux-baremetal module:
{{ CROSS_CC }} targets/syscalls.c {{ LINUX_BAREMETAL_CFLAGS }} -c -o {{ BUILD_DIR }}-{{ module }}/syscalls.o
[doc("Compile newlib syscall stubs")]
[group("2: build host")]
build-system-syscalls module target="fail":
#!/usr/bin/env sh
if [ "{{ target }}" = "fail" ]; then
just build-system-syscalls-fail "{{ module }}"
elif [ "{{ target }}" = "linux-baremetal" ]; then
just build-system-syscalls-linux-baremetal "{{ module }}"
else
echo "{{ target }} doesn't require syscall stubs"
fi
[private]
link-system-fail module:
{{ CROSS_CC }} \
-Wl,-T targets/linker.ld \
{{ BUILD_DIR }}-{{ module }}/system.o \
{{ BUILD_DIR }}-{{ module }}/startup.o \
{{ BUILD_DIR }}-{{ module }}/syscalls.o \
{{ CROSS_LDFLAGS }} \
-o {{ BUILD_DIR }}-{{ module }}/system.elf
[private]
link-system-linux module:
{{ LINUX_CC }} \
{{ BUILD_DIR }}-{{ module }}/system.o \
{{ LINUX_LDFLAGS }} \
-o {{ BUILD_DIR }}-{{ module }}/system.elf
[private]
link-system-linux-baremetal module:
{{ CROSS_CC }} \
{{ BUILD_DIR }}-{{ module }}/system.o \
{{ BUILD_DIR }}-{{ module }}/syscalls.o \
{{ LINUX_BAREMETAL_LDFLAGS }} \
-o {{ BUILD_DIR }}-{{ module }}/system.elf
[doc("Link C-Host, syscall stubs and bootloader")]
[group("2: build host")]
link-system module target="fail":
#!/usr/bin/env sh
if [ "{{ target }}" = "fail" ]; then
just link-system-fail "{{ module }}"
elif [ "{{ target }}" = "linux" ]; then
just link-system-linux "{{ module }}"
elif [ "{{ target }}" = "linux-baremetal" ]; then
just link-system-linux-baremetal "{{ module }}"
else
echo "unknown target: {{ target }}" >&2
exit 1
fi
[private]
link-c-system-fail module:
{{ CROSS_CC }} \
-Wl,-T targets/linker.ld \
{{ BUILD_DIR }}-{{ module }}/c_host.o \
{{ BUILD_DIR }}-{{ module }}/startup.o \
{{ BUILD_DIR }}-{{ module }}/c_module.o \
{{ CROSS_LDFLAGS_NOWASM }} \
-o {{ BUILD_DIR }}-{{ module }}/system.elf
[private]
link-c-system-linux module:
{{ LINUX_CC }} \
{{ BUILD_DIR }}-{{ module }}/c_host.o \
{{ BUILD_DIR }}-{{ module }}/c_module.o \
{{ LINUX_LDFLAGS_NOWASM }} \
-o {{ BUILD_DIR }}-{{ module }}/system.elf
[doc("Link C-Host, C-function and bootloader")]
[group("2: build host")]
link-c-system module target="fail":
#!/usr/bin/env sh
if [ "{{ target }}" = "fail" ]; then
just link-c-system-fail "{{ module }}"
elif [ "{{ target }}" = "linux" ]; then
just link-c-system-linux "{{ module }}"
else
echo "unknown target: {{ target }}" >&2
exit 1
fi
[doc("Create bootdisk")]
[group("2: build host")]
build-iso module:
mkdir -p {{ BUILD_DIR }}-{{ module }}/grub/boot/grub
cp targets/grub.cfg {{ BUILD_DIR }}-{{ module }}/grub/boot/grub/
cp {{ BUILD_DIR }}-{{ module }}/system.elf {{ BUILD_DIR }}-{{ module }}/grub/boot/
grub-mkrescue -o {{ BUILD_DIR }}-{{ module }}/system.iso {{ BUILD_DIR }}-{{ module }}/grub

View File

@ -16,17 +16,18 @@ use feature 'say';
my $local_root = '/home/christoph/Notes/TU/MastersThesis/FailNix';
my $local_builds_dir = "$local_root/builds";
my $local_experiments_dir = "$local_root/targets/wasm-module";
my $justbin = "$local_root/just-bin/just";
my $justfile = "$local_root/scripts/build.just";
my $compile_pl = "$local_root/scripts/compile.pl";
my @targets = ( "fail", "linux", "linux-baremetal" );
my @modes = ( "c", "aot", "interp" );
sub compile {
my ( $module, $target, $mode ) = @_;
say "Running: WAMR_USE_AOT_IN_TEXT=$ENV{WAMR_USE_AOT_IN_TEXT}",
" WAMR_USE_MMAP_IN_TEXT=$ENV{WAMR_USE_MMAP_IN_TEXT}",
" WAMR_USE_XIP=$ENV{WAMR_USE_XIP}",
" WAMR_USE_ALLOCATOR=$ENV{WAMR_USE_ALLOCATOR}",
" compile.pl $module $target $mode";
sub just {
say
"Running: WAMR_USE_AOT_SECTION=$ENV{WAMR_USE_AOT_SECTION} WAMR_USE_MMAP=$ENV{WAMR_USE_MMAP} WAMR_USE_XIP=$ENV{WAMR_USE_XIP} just @_...";
system("$justbin -d $local_root -f $justfile @_ >/dev/null 2>&1")
and die "Build failed";
system( 'perl', $compile_pl, $module, $target, $mode ) == 0
or die "Build failed\n";
sleep(1);
}
@ -37,11 +38,13 @@ my @selected_experiments =
die "No experiment selected" unless @selected_experiments;
# Select targets
my @targets = ( "fail", "linux", "linux-baremetal" );
my @selected_targets =
TUI::select_from_list( "Select Target Platforms", 1, @targets );
die "No target selected" unless @selected_targets;
# Select modes
my @modes = ( "c", "aot", "interp" );
my @selected_modes =
TUI::select_from_list( "Select Execution Modes", 1, @modes );
die "No mode selected" unless @selected_modes;
@ -51,27 +54,53 @@ my @aot_section_variants = (
"Place AOT array in .text.wamr_aot",
"Let the linker decide where the AOT array is located",
);
my @selected_aot_variants =
my $selected_aot_variant =
TUI::select_from_list( "Select WAMR Array.Text Variant",
1, @aot_section_variants );
die "No AOT section variant selected" unless @selected_aot_variants;
0, @aot_section_variants );
die "No AOT section variant selected" unless $selected_aot_variant;
local $ENV{WAMR_USE_AOT_IN_TEXT} =
( $selected_aot_variant eq $aot_section_variants[0] )
? "true"
: "false";
# Select WAMR mmap variant
my @mmap_variants = (
"Locate mmap_space in .text.wamr_mmap",
"Place mmap_space in .text.wamr_mmap",
"Let the linker decide where mmap_space is located"
);
my @selected_mmap_variants =
TUI::select_from_list( "Select WAMR Mmap.Text Variant", 1, @mmap_variants );
die "No variant selected" unless @selected_mmap_variants;
my $selected_mmap_variant =
TUI::select_from_list( "Select WAMR Mmap.Text Variant", 0, @mmap_variants );
die "No variant selected" unless $selected_mmap_variant;
local $ENV{WAMR_USE_MMAP_IN_TEXT} =
( $selected_mmap_variant eq $mmap_variants[0] )
? "true"
: "false";
# Select WAMR allocator variant
my @allocator_variants = (
"Pool allocator (Alloc_With_Pool)",
"Allocator with usage (Alloc_With_Allocator)",
);
my $selected_allocator_variant =
TUI::select_from_list( "Select WAMR Allocator Variant",
0, @allocator_variants );
die "No allocator variant selected" unless $selected_allocator_variant;
local $ENV{WAMR_USE_ALLOCATOR} =
( $selected_allocator_variant eq $allocator_variants[0] )
? "true"
: "false";
# Select XIP variant
my @xip_variants = ( "Compile AOT with --xip", "Compile AOT without --xip" );
my @selected_xip_variants =
TUI::select_from_list( "Select WAMRC XIP Variant", 1, @xip_variants );
die "No XIP variant selected" unless @selected_xip_variants;
my $selected_xip_variant =
TUI::select_from_list( "Select WAMRC XIP Variant", 0, @xip_variants );
die "No XIP variant selected" unless $selected_xip_variant;
local $ENV{WAMR_USE_XIP} =
( $selected_xip_variant eq $xip_variants[0] )
? "true"
: "false";
# Select FAIL catch flags (written to runner_flags in each build dir, not a build loop)
# Select FAIL catch flags (written to runner_flags in each build dir)
my %catch_flag_map = (
"--catch-outer" => "--catch-outerspace",
"--catch-text" => "--catch-write-textsegment",
@ -79,111 +108,71 @@ my %catch_flag_map = (
my @selected_catch_tags =
TUI::select_from_list( "Select FAIL Flags", 1, sort keys %catch_flag_map );
# Select 0.info contents
my $info = join " ", TUI::select_from_list(
"Select '0.info' Contents for ",
1,
(
# mmap, xip, wamr_aot, --catch-outer, --catch-text are auto-included from variant selections
"baseline",
)
);
# Build everything
# TODO: linux-baremetal target is broken
system( "mkdir", "-p", "$local_builds_dir" );
foreach my $experiment (@selected_experiments) {
foreach my $target (@selected_targets) {
foreach my $mode (@selected_modes) {
foreach my $mmap_variant (@selected_mmap_variants) {
foreach my $xip_variant (@selected_xip_variants) {
foreach my $aot_variant (@selected_aot_variants) {
# Skip redundant combinations where variants don't apply to this mode
# "c" uses no WAMR at all
# "interp" uses mmap but no AOT
next
if $mode eq "c"
&& ( $mmap_variant ne $mmap_variants[0]
|| $xip_variant ne $xip_variants[0]
|| $aot_variant ne $aot_section_variants[0] );
next
if $mode eq "interp"
&& ( $xip_variant ne $xip_variants[0]
|| $aot_variant ne $aot_section_variants[0] );
my $aot_info =
( $mode eq "aot"
&& $selected_aot_variant eq $aot_section_variants[0] )
? "wamr_aot"
: "";
my $mmap_info =
( ( $mode eq "aot" || $mode eq "interp" )
&& $selected_mmap_variant eq $mmap_variants[0] )
? "wamr_mmap"
: "";
my $allocator_info =
( ( $mode eq "aot" || $mode eq "interp" )
&& $selected_allocator_variant eq $allocator_variants[0] )
? "alloc_pool"
: "alloc_usage";
my $xip_info =
( $mode eq "aot" && $selected_xip_variant eq $xip_variants[0] )
? "xip"
: "";
my $flags_info = join " ", @selected_catch_tags;
my $info_str = join " ",
grep { length } (
$mode, $aot_info, $mmap_info,
$allocator_info, $xip_info, $flags_info
);
# These variables control which libiwasm, wamrc flags, and build options are used
local $ENV{WAMR_USE_MMAP} =
( $mmap_variant eq
"Locate mmap_space in .text.wamr_mmap" )
? "true"
: "false";
local $ENV{WAMR_USE_XIP} =
( $xip_variant eq "Compile AOT with --xip" )
? "true"
: "false";
local $ENV{WAMR_USE_AOT_SECTION} =
( $aot_variant eq
"Place AOT array in .text.wamr_aot" )
? "true"
: "false";
# Build experiment
my $date = strftime( "%m-%d_%H-%M-%S", localtime );
compile( $experiment, $target, $mode );
my $aot_info =
( $mode eq "aot"
&& $aot_variant eq
"Place AOT array in .text.wamr_aot" )
? "wamr_aot"
: "";
my $mmap_info =
( ( $mode eq "aot" || $mode eq "interp" )
&& $mmap_variant eq
"Locate mmap_space in .text.wamr_mmap" )
? "wamr_mmap"
: "";
my $xip_info =
( $mode eq "aot"
&& $xip_variant eq "Compile AOT with --xip" )
? "xip"
: "";
my $flags_info = join " ", @selected_catch_tags;
my $info_str = join " ",
grep { length } (
$mode, $aot_info, $mmap_info,
$xip_info, $flags_info, $info
);
# Write extra info for the menu
system("echo '$info_str' > $local_root/build-$experiment/0.info");
# Build experiment
my $date = strftime( "%m-%d_%H-%M-%S", localtime );
just( "build", $experiment, $target, $mode );
# Write runner_flags so runner.pl knows which FAIL flags to use
my $runner_flags_path =
"$local_root/build-$experiment/runner_flags";
open( my $fhandle, '>', $runner_flags_path )
or die "Cannot write $runner_flags_path: $!";
print $fhandle "$catch_flag_map{$_}\n" for @selected_catch_tags;
close($fhandle);
# Write extra info for the menu
system(
"echo '$info_str' > $local_root/build-$experiment/0.info"
);
# Write runner_flags so runner.pl knows which FAIL flags to use
my $runner_flags_path =
"$local_root/build-$experiment/runner_flags";
open( my $rfh, '>', $runner_flags_path )
or die "Cannot write $runner_flags_path: $!";
print $rfh "$catch_flag_map{$_}\n"
for @selected_catch_tags;
close($rfh);
my $aot_name = $aot_info ? "_aot-text" : "";
my $mmap_name = $mmap_info ? "_mmap-text" : "";
my $xip_name = $xip_info ? "_xip" : "";
system(
join " ",
(
"mv",
"$local_root/build-$experiment",
"$local_builds_dir/${date}_${experiment}_${mode}_${target}${aot_name}${mmap_name}${xip_name}",
)
);
}
}
}
my $aot_name = $aot_info ? "_aot-text" : "";
my $mmap_name = $mmap_info ? "_mmap-text" : "";
my $allocator_name = $allocator_info ? "_alloc-usage" : "";
my $xip_name = $xip_info ? "_xip" : "";
system(
join " ",
(
"mv",
"$local_root/build-$experiment",
join "",
(
"$local_builds_dir/",
"${date}_${experiment}_${mode}_${target}",
"${aot_name}${mmap_name}${allocator_name}${xip_name}",
)
)
);
}
}
}

417
scripts/compile.pl Normal file
View File

@ -0,0 +1,417 @@
#!/usr/bin/env perl
use strict;
use warnings;
use feature 'say';
use File::Copy qw(copy);
use File::Path qw(rmtree make_path);
use Cwd qw(abs_path);
use FindBin;
use lib $FindBin::Bin;
use Util;
# ========================================================================================= #
# Project root
# ========================================================================================= #
my $root = abs_path("$FindBin::Bin/..");
chdir($root) or die "Cannot chdir to $root: $!\n";
# ========================================================================================= #
# Environment set by "nix develop"
# ========================================================================================= #
sub require_env {
my ($name) = @_;
return $ENV{$name}
// die "$name is not set (run from 'nix develop' shell)\n";
}
my $wasi_root = require_env('WASI_ROOT');
my $wamr_root = require_env('WAMR_ROOT');
my $cross_cc = require_env('CROSS_CC');
my $linux_cc = require_env('LINUX_CC');
my $use_aot_in_text = ( $ENV{WAMR_USE_AOT_IN_TEXT} // 'false' ) eq 'true';
my $use_mmap_in_text = ( $ENV{WAMR_USE_MMAP_IN_TEXT} // 'false' ) eq 'true';
my $use_xip = ( $ENV{WAMR_USE_XIP} // 'false' ) eq 'true';
my $use_allocator = ( $ENV{WAMR_USE_ALLOCATOR} // 'false' ) eq 'true';
# ========================================================================================= #
# WAMR cmake configuration
# ========================================================================================= #
# Flags common to all platforms
my @wamr_cmake_base = (
'-DCMAKE_BUILD_TYPE=Debug', '-DWAMR_BUILD_TARGET=X86_32',
'-DWAMR_BUILD_AOT=1', '-DWAMR_BUILD_WAMR_COMPILER=0',
'-DWAMR_BUILD_INTERP=1', '-DWAMR_BUILD_FAST_INTERP=0',
'-DWAMR_BUILD_JIT=0', '-DWAMR_BUILD_FAST_JIT=0',
'-DWAMR_BUILD_LIBC_BUILTIN=1', '-DWAMR_BUILD_LIBC_WASI=0',
'-DWAMR_BUILD_SIMD=0',
);
my @wamr_cmake_baremetal = (
'-DWAMR_BUILD_PLATFORM=baremetal',
'-DCMAKE_SYSTEM_NAME=Generic',
'-DCMAKE_SYSTEM_PROCESSOR=i386',
'-DCMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY',
);
my @wamr_cmake_linux = ( '-DWAMR_BUILD_PLATFORM=linux', );
# Variant defines passed as CMAKE_C_FLAGS
my @variant_cflags =
( '-Wno-error=implicit-function-declaration', '-O0', '-ggdb3' );
push @variant_cflags, '-DWAMR_MMAP_IN_TEXT=0' unless $use_mmap_in_text;
push @variant_cflags, '-DWASM_MEM_ALLOC_WITH_USAGE=1' if $use_allocator;
my $cmake_c_flags = join( ' ', @variant_cflags );
# Variant options passed as cmake variables
my @variant_cmake_flags;
push @variant_cmake_flags, '-DWAMR_BUILD_ALLOC_WITH_USAGE=1' if $use_allocator;
# ========================================================================================= #
# Compiler / linker flags
# ========================================================================================= #
my @wasi_cflags = (
'--target=wasm32', "--sysroot=$wasi_root/share/wasi-sysroot",
'-z', 'stack-size=4096',
'-O0', '-nostdlib',
'-Wl,--no-entry', '-Wl,--export=wasm_module',
'-Wl,--no-gc-sections', '-Wl,--initial-memory=65536',
'-Wl,--export=__heap_base', '-Wl,--export=__data_end',
);
my @cross_cflags =
qw(-O0 -m32 -ffunction-sections -fdata-sections -ffreestanding -fpermissive -ggdb3);
my @linux_cflags =
qw(-O0 -m32 -ffunction-sections -fdata-sections -fpermissive -ggdb3);
my @linux_baremetal_cflags =
qw(-O0 -m32 -ffunction-sections -fdata-sections -ffreestanding -ggdb3);
# libiwasm.a is passed as a direct file path (no -L/-liwasm)
my @cross_ldflags_base = (
'-Wl,--build-id=none', '-static', '-nostdlib', '-m32',
'-lc', '-lgcc', '-lm'
);
my @linux_ldflags_base = ( '-Wl,--build-id=none', '-m32', '-lm' );
my @baremetal_ldflags_base = (
'-Wl,--build-id=none', '-static', '-nostdlib', '-m32',
'-lc', '-lgcc', '-lm', '--entry',
'main'
);
my @cross_ldflags_nowasm = (
'-Wl,--build-id=none', '-static', '-nostdlib', '-m32',
'-lc', '-lgcc', '-lm'
);
my @linux_ldflags_nowasm = ( '-Wl,--build-id=none', '-m32', '-lm' );
my @wamr_inc_baremetal = (
"-I$wamr_root/core/iwasm/include",
"-I$wamr_root/core/shared/utils",
"-I$wamr_root/core/shared/platform/baremetal",
);
my @wamr_inc_linux = (
"-I$wamr_root/core/iwasm/include",
"-I$wamr_root/core/shared/utils",
"-I$wamr_root/core/shared/platform/linux",
);
my @cross_wamrcflags = ( '--target=i386', '--cpu=generic', '--opt-level=0' );
push @cross_wamrcflags, '--xip' if $use_xip;
my @linux_wamrcflags = ( '--target=i386', '--cpu=generic', '--opt-level=0' );
# ========================================================================================= #
# Entry point
# ========================================================================================= #
die "Usage: compile.pl <module> <target> <mode>\n"
. " target: fail | linux | linux-baremetal\n"
. " mode: aot | interp | c\n"
unless @ARGV == 3;
my ( $module, $target, $mode ) = @ARGV;
build( $module, $target, $mode );
# ========================================================================================= #
# Build
# ========================================================================================= #
sub build {
my ( $module, $target, $mode ) = @_;
my $bd = "build-$module";
rmtree($bd);
make_path($bd);
copy_auxiliary( $module, $bd );
build_libiwasm( $module, $bd, $target );
if ( $mode eq 'aot' || $mode eq 'interp' ) {
compile_wasm_module( $module, $bd );
if ( $mode eq 'aot' ) {
compile_wasm_aot( $module, $bd, $target );
make_aot_array( $module, $bd );
}
else {
make_interp_array( $module, $bd );
}
prepare_wasm_host( $module, $bd, $mode );
compile_wasm_host( $module, $bd, $target );
compile_startup( $module, $bd, $target );
compile_syscalls( $module, $bd, $target );
link_wasm( $module, $bd, $target );
}
elsif ( $mode eq 'c' ) {
compile_c_module( $module, $bd, $target );
compile_c_host( $module, $bd, $target );
compile_startup( $module, $bd, $target );
link_c( $module, $bd, $target );
}
else {
die "Unknown mode '$mode'; expected: aot, interp, c\n";
}
build_iso( $module, $bd );
}
# ========================================================================================= #
# Steps
# ========================================================================================= #
sub build_libiwasm {
my ( $module, $bd, $target ) = @_;
my $cmake_bd = "$bd/wamr-build";
make_path($cmake_bd);
my ( $cmake_cc, @sys_flags ) =
( $target eq 'linux' )
? ( $linux_cc, @wamr_cmake_linux )
: ( $cross_cc, @wamr_cmake_baremetal );
Util::run(
'cmake', '-S',
$wamr_root, '-B',
$cmake_bd, "-DCMAKE_C_COMPILER=$cmake_cc",
@wamr_cmake_base, @sys_flags,
@variant_cmake_flags, "-DCMAKE_C_FLAGS=$cmake_c_flags",
);
Util::run( 'cmake', '--build', $cmake_bd );
copy( "$cmake_bd/libiwasm.a", "$bd/libiwasm.a" )
or die "failed to copy $cmake_bd/libiwasm.a: $!";
}
sub copy_auxiliary {
my ( $module, $bd ) = @_;
my @files = (
[ 'flake.nix', "$bd/flake.nix" ],
[ 'scripts/runner.pl', "$bd/runner.pl" ],
[ 'scripts/compile.pl', "$bd/compile.pl" ],
[ 'targets/lib.h', "$bd/lib.h" ],
[ 'targets/linker.ld', "$bd/linker.ld" ],
[ 'targets/startup.s', "$bd/startup.s" ],
[ 'targets/syscalls.c', "$bd/syscalls.c" ],
[ "targets/wasm-module/$module.cpp", "$bd/wasm-module.cpp" ],
);
for my $pair (@files) {
copy( $pair->[0], $pair->[1] )
or die "failed to copy $pair->[0] -> $pair->[1]: $!";
}
}
sub compile_wasm_module {
my ( $module, $bd ) = @_;
Util::run( "$wasi_root/bin/clang", @wasi_cflags,
"targets/wasm-module/$module.cpp",
'-o', "$bd/wasm_module.wasm" );
}
sub compile_wasm_aot {
my ( $module, $bd, $target ) = @_;
my @flags = ( $target eq 'linux' ) ? @linux_wamrcflags : @cross_wamrcflags;
Util::run( 'wamrc', @flags, '-o', "$bd/wasm_module.aot", "$bd/wasm_module.wasm" );
}
sub make_aot_array {
my ( $module, $bd ) = @_;
open( my $xxd, '-|', 'xxd', '-i', "$bd/wasm_module.aot" )
or die "failed to run xxd: $!";
my $content = do { local $/; <$xxd> };
close($xxd);
$content =
qq{__attribute__((section(".text.wamr_aot"), aligned(4096)))\n}
. $content
if $use_aot_in_text;
Util::write_file( "$bd/wasm_aot_array.c", $content );
}
sub make_interp_array {
my ( $module, $bd ) = @_;
open( my $xxd, '-|', 'xxd', '-i', "$bd/wasm_module.wasm" )
or die "Cannot run xxd: $!\n";
my $content = do { local $/; <$xxd> };
close($xxd);
Util::write_file( "$bd/wasm_interp_array.c", $content );
}
sub prepare_wasm_host {
my ( $module, $bd, $mode ) = @_;
my $template =
$use_allocator
? 'targets/wasm-host/wasm_host_allocator.c'
: 'targets/wasm-host/wasm_host_pool.c';
my $mod_c = ( $module =~ s/-/_/gr );
my ( $array_file, $array_sym, $len_sym ) =
( $mode eq 'aot' )
? (
'wasm_aot_array.c',
"build_${mod_c}_wasm_module_aot",
"build_${mod_c}_wasm_module_aot_len"
)
: (
'wasm_interp_array.c',
"build_${mod_c}_wasm_module_wasm",
"build_${mod_c}_wasm_module_wasm_len"
);
my $content = Util::read_file($template);
$content =~ s/__WASM_ARRAY_FILE__/$array_file/g;
$content =~ s/__WASM_ARRAY__/$array_sym/g;
$content =~ s/__WASM_ARRAY_LEN__/$len_sym/g;
Util::write_file( "$bd/module_host.c", $content );
}
sub compile_wasm_host {
my ( $module, $bd, $target ) = @_;
if ( $target eq 'fail' ) {
Util::run(
$cross_cc, '-I./targets/wasm-host',
@cross_cflags, @wamr_inc_baremetal,
'-DTARGET_FAIL', '-c',
"$bd/module_host.c", '-o',
"$bd/system.o"
);
}
elsif ( $target eq 'linux' ) {
Util::run(
$linux_cc, '-I./targets/wasm-host',
@linux_cflags, @wamr_inc_linux,
'-DTARGET_LINUX', '-c',
"$bd/module_host.c", '-o',
"$bd/system.o"
);
}
elsif ( $target eq 'linux-baremetal' ) {
Util::run(
$cross_cc, '-I./targets/wasm-host',
@linux_baremetal_cflags, @wamr_inc_baremetal,
'-DTARGET_LINUX_BAREMETAL', '-c',
"$bd/module_host.c", '-o',
"$bd/system.o"
);
}
else {
die "Unknown target '$target'\n";
}
}
sub compile_c_module {
my ( $module, $bd, $target ) = @_;
my ( $cc, @flags ) =
( $target eq 'linux' )
? ( $linux_cc, @linux_cflags )
: ( $cross_cc, @cross_cflags );
Util::run( $cc, @flags, '-c', "targets/wasm-module/$module.cpp",
'-o', "$bd/c_module.o" );
}
sub compile_c_host {
my ( $module, $bd, $target ) = @_;
my ( $cc, @flags ) =
( $target eq 'linux' )
? ( $linux_cc, @linux_cflags, '-DTARGET_LINUX' )
: ( $cross_cc, @cross_cflags, '-DTARGET_FAIL' );
Util::run( $cc, @flags, '-c', 'targets/c-host/c_host.c', '-o', "$bd/c_host.o" );
copy( 'targets/c-host/c_host.c', "$bd/module_host.c" );
}
sub compile_startup {
my ( $module, $bd, $target ) = @_;
return unless $target eq 'fail';
Util::run( $cross_cc, 'targets/startup.s', '-I./targets/wasm-host', @cross_cflags,
'-c', '-o', "$bd/startup.o" );
}
sub compile_syscalls {
my ( $module, $bd, $target ) = @_;
if ( $target eq 'fail' ) {
Util::run( $cross_cc, 'targets/syscalls.c',
'-I./targets/wasm-host', @cross_cflags,
'-c', '-o', "$bd/syscalls.o" );
}
elsif ( $target eq 'linux-baremetal' ) {
Util::run( $cross_cc, 'targets/syscalls.c', @linux_baremetal_cflags,
'-c', '-o', "$bd/syscalls.o" );
}
# Linux needs neither startup nor syscall stubs
}
sub link_wasm {
my ( $module, $bd, $target ) = @_;
if ( $target eq 'fail' ) {
Util::run(
$cross_cc, '-Wl,-T',
'targets/linker.ld', "$bd/system.o",
"$bd/startup.o", "$bd/syscalls.o",
"$bd/libiwasm.a", @cross_ldflags_base,
'-o', "$bd/system.elf"
);
}
elsif ( $target eq 'linux' ) {
Util::run( $linux_cc, "$bd/system.o", "$bd/libiwasm.a", @linux_ldflags_base,
'-o', "$bd/system.elf" );
}
elsif ( $target eq 'linux-baremetal' ) {
Util::run( $cross_cc, "$bd/system.o", "$bd/syscalls.o", "$bd/libiwasm.a",
@baremetal_ldflags_base, '-o', "$bd/system.elf" );
}
else {
die "Unknown target '$target'\n";
}
}
sub link_c {
my ( $module, $bd, $target ) = @_;
if ( $target eq 'fail' ) {
Util::run(
$cross_cc, '-Wl,-T',
'targets/linker.ld', "$bd/c_host.o",
"$bd/startup.o", "$bd/c_module.o",
@cross_ldflags_nowasm, '-o',
"$bd/system.elf"
);
}
elsif ( $target eq 'linux' ) {
Util::run( $linux_cc, "$bd/c_host.o", "$bd/c_module.o", @linux_ldflags_nowasm,
'-o', "$bd/system.elf" );
}
else {
die "C mode is not supported for target '$target'\n";
}
}
sub build_iso {
my ( $module, $bd ) = @_;
make_path("$bd/grub/boot/grub");
copy( 'targets/grub.cfg', "$bd/grub/boot/grub/grub.cfg" )
or die "failed to copy grub.cfg: $!\n";
copy( "$bd/system.elf", "$bd/grub/boot/system.elf" )
or die "failed to copy system.elf: $!\n";
Util::run( 'grub-mkrescue', '-o', "$bd/system.iso", "$bd/grub" );
}

View File

@ -14,19 +14,14 @@ use Text::CSV_XS;
use feature 'say';
# TODO: Less navigation if the object is selected first, then the action
# - Differentiate between local/remote object
# - List all types in the same list?
# - Select actions afterwards and apply fitting ones all in one go
# - Hide unfeasible actions
# TODO: Much can be extracted into utility functions
my $local_obsidian = '/home/christoph/Notes/Obsidian/Chriphost';
my $local_obsidian_attach = "$local_obsidian/attach";
my $local_wamr = '/home/christoph/Notes/TU/MastersThesis/05 WAMR';
my $local_newlib = '/home/christoph/Notes/TU/MastersThesis/07 NewLib';
my $local_root = '/home/christoph/Notes/TU/MastersThesis/FailNix';
my $local_wamr = "$local_root/wamr";
my $local_scripts_dir = "$local_root/scripts";
my $local_builds_dir = "$local_root/builds";
my $local_archive_dir = "$local_root/injections";
@ -405,8 +400,7 @@ my %handlers = (
my $selected_build = $selected_builds[0];
my $build_dir = "$local_builds_dir/$selected_build";
my $build_name = $selected_build =~ s/.*-.*-.*:.*:.*?_(.*)-.*-.*/$1/r;
my $module_source = "$local_root/build-$build_name";
my $build_name = $selected_build =~ s/.*?_.*?_(.*?)_.*$/$1/r;
say "$build_name";
@ -418,7 +412,7 @@ my %handlers = (
'-ex',
'set disassembly-flavor intel',
'-ex',
"set substitute-path '$module_source' '$build_dir'",
"set substitute-path 'build-$build_name' '$build_dir'",
'-ex',
"set substitute-path '/build/source/core' '$local_wamr/core'",
'-ex',
@ -433,6 +427,16 @@ my %handlers = (
'break fail_marker_detected',
'-ex',
'break fail_marker_negative',
'-ex',
'break fail_marker_group1',
'-ex',
'break os_mmap',
'-ex',
'break wamr_malloc',
'-ex',
'break wamr_realloc',
'-ex',
'break wamr_free',
);
},