From 34f37b89447cfbffce7bd3e40164a35b13b5b347 Mon Sep 17 00:00:00 2001 From: "Kartik K. Agaram" Date: Sat, 30 Oct 2021 07:29:15 -0700 Subject: clean up treeshaking support for baremetal Check minified sizes by running: tools/translate_minified _files_ ls -l a.bin qemu-system-i386 code.img What I had before was for the linux/ version. --- tools/mu-init-minify.subx | 19 +++++++++ tools/translate_minified | 106 ++++++++++++++++++++++++++++++++++++++++++++++ tools/treeshake_all | 63 --------------------------- tools/treeshake_translate | 8 ---- 4 files changed, 125 insertions(+), 71 deletions(-) create mode 100644 tools/mu-init-minify.subx create mode 100755 tools/translate_minified delete mode 100755 tools/treeshake_all delete mode 100755 tools/treeshake_translate diff --git a/tools/mu-init-minify.subx b/tools/mu-init-minify.subx new file mode 100644 index 00000000..f5425b4d --- /dev/null +++ b/tools/mu-init-minify.subx @@ -0,0 +1,19 @@ +# Initialize the minimal runtime for Mu programs without any tests. +# +# See translate_min for how this file is used. +# +# Mu programs start at a function called 'main' with this signature: +# fn main screen: (addr screen), keyboard: (addr keyboard), data-disk: (addr disk) + +== code + +Entry: + # initialize stack + bd/copy-to-ebp 0/imm32 + # + (main 0 0 Primary-bus-secondary-drive) + + # hang indefinitely + { + eb/jump loop/disp8 + } diff --git a/tools/translate_minified b/tools/translate_minified new file mode 100755 index 00000000..27cd5473 --- /dev/null +++ b/tools/translate_minified @@ -0,0 +1,106 @@ +#!/bin/sh +# Translate a Mu program to a _minified_ bootable disk image. +# +# Hacky; only intended for some stats at the moment, even though all programs +# I've run through it seem to continue to work. If there are no power-on unit +# tests, I don't trust it. + +set -ev + +# Map of the Mu code disk +export DISK=20160 # 20*16*63 512-byte sectors = almost 10MB +dd if=/dev/zero of=code.img count=$DISK status=none +# code: sectors 0-8999 +# font: sectors 9000-10079 (1080 sectors = space enough for 16k glyphs (1080 * 512 / 34 bytes per glyph)) +export FONT=9000 # keep this sync'd with boot.subx +# debug: sector 10080 onwards +export DEBUG=10080 + +## Code + +cat $* [0-9]*.mu |linux/mu > a.subx + +cat boot.subx |grep -vh '^\s*$\|^\s*#' > a.boot.strip +cat tools/mu-init-minify.subx [0-9]*.subx a.subx|grep -vh '^\s*$\|^\s*#' > a.strip + +# treeshake everything but boot.subx, which isn't quite standard SubX and +# doesn't get parsed correctly by treeshake for some reason. +cat a.strip |tools/treeshake > a.treeshake + +cat a.boot.strip a.treeshake |linux/braces > a.braces + +cat a.braces |linux/calls > a.calls + +cat a.calls |linux/sigils > a.sigils + +cat a.sigils |linux/tests > a.tests + +# no assort since baremetal SubX doesn't have segments yet + +cat a.tests |linux/dquotes > a.dquotes + +cat a.dquotes |linux/pack > a.pack + +cat a.pack |linux/survey_baremetal > labels +cat a.pack |linux/labels_baremetal labels > a.survey + +cat a.survey |linux/hex > a.bin + +dd if=a.bin of=code.img conv=notrunc status=none + +if [ `stat --printf="%s" a.bin` -ge 492544 ] # 15 tracks * 63 sectors per track * 512 bytes per sector (keep this sync'd with boot.subx) +then + echo "a.bin won't all be loaded on boot" + exit 1 +fi + +if [ `stat --printf="%s" a.bin` -ge 492544 ] # 15 tracks * 63 sectors per track * 512 bytes per sector +then + echo "a.bin will overwrite BIOS/Video memory; you'll need to adjust boot.subx to load code to some other non-contiguous area of memory" + exit 1 +fi + +if [ `stat --printf="%s" a.bin` -ge $(($FONT*512)) ] +then + echo "a.bin will overwrite font in disk" + exit 1 +fi + +## Latter half of disk is for debug info + +if [ `stat --printf="%s" labels` -ge 1048576 ] # 8 reads * 256 sectors * 512 bytes per sector +then + echo "labels won't all be loaded on abort" + exit 1 +fi + +if [ `wc -l < labels` -gt 20480 ] # 0x5000 stream capacity in abort.subx +then + echo "abort will go into infinite regress" + exit 1 +fi + +dd if=labels of=code.img seek=$DEBUG conv=notrunc status=none # keep this sync'd with abort.subx + +## Font data at another well-defined location +cat font.subx |sed 's,/[^ ]*,,' |linux/hex > a.font + +if [ `stat --printf="%s" a.font` -ge 262144 ] # 0x200 sectors * 512 bytes per sector (keep this sync'd with boot.subx) +then + echo "font won't all be loaded on boot" + exit 1 +fi + +if [ `stat --printf="%s" a.font` -ge 14680064 ] # 0x00e00000 = 0x00f00000 - 0x00100000 +then + echo "font is so large it overlaps the ISA memory hole; see https://wiki.osdev.org/Memory_Map_(x86)" + exit 1 +fi + +if [ `stat --printf="%s" a.font` -ge $(( ($DEBUG - $FONT) * 512 )) ] +then + echo "font will overwrite debug info in disk" + exit 1 +fi + +dd if=a.font of=code.img seek=$FONT conv=notrunc status=none diff --git a/tools/treeshake_all b/tools/treeshake_all deleted file mode 100755 index b05de395..00000000 --- a/tools/treeshake_all +++ /dev/null @@ -1,63 +0,0 @@ -#!/bin/sh -# Build minimal-size versions of all apps. -# Hacky; only intended for some stats at the moment. - -set -e - -[ ! -f tools/treeshake ] && { - echo building tools/treeshake - c++ -g -O3 tools/treeshake.cc -o tools/treeshake -} - -export OS=${OS:-linux} - -process() { - app=$1 - tools/treeshake_translate init.$OS [012]*.subx apps/subx-params.subx apps/$app.subx - echo "LoC $(cat apps/$app.subx |wc -l) => $(grep -vh '^\s*$\|^\s*#' apps/$app.subx |tools/treeshake |wc -l)" - echo "LoC including common libraries: $(cat a.in |wc -l) => $(cat a.treeshake |wc -l)" - echo "binary size: $(ls -lh apps/$app |column 5) => $(ls -lh a.elf |column 5)" -} - -if [ $# -gt 0 ] -then - process $1 - exit 0 -fi - -echo "== deleting dead code" -for app in factorial crenshaw2-1 crenshaw2-1b hex survey pack dquotes assort tests sigils calls braces -do - echo "- $app" - process $app - mv a.in apps/$app.in - mv a.treeshake apps/$app.treeshake - mv a.elf apps/$app.treeshake.bin -done - -echo "== testing treeshaken binaries" -for app in factorial crenshaw2-1 crenshaw2-1b -do - echo $app - tools/test_treeshake_translate init.$OS [01]*.subx apps/$app.subx - diff apps/$app a.elf -done - -for app in hex survey pack assort dquotes tests -do - echo $app - tools/test_treeshake_translate init.$OS [01]*.subx apps/subx-params.subx apps/$app.subx - diff apps/$app a.elf -done - -for app in sigils calls braces -do - echo $app - tools/test_treeshake_translate init.$OS [012]*.subx apps/subx-params.subx apps/$app.subx - diff apps/$app a.elf -done - -app=mu -echo $app -tools/test_treeshake_translate init.$OS [0-9]*.subx apps/$app.subx -diff apps/$app a.elf diff --git a/tools/treeshake_translate b/tools/treeshake_translate deleted file mode 100755 index 36fcf7c6..00000000 --- a/tools/treeshake_translate +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh -# Translate SubX into minified ELF binaries for Linux. - -set -e - -grep -vh '^\s*#\|^\s*$' $* > a.in -cat a.in |tools/treeshake > a.treeshake -./translate_subx a.treeshake -- cgit 1.4.1-2-gfad0