diff options
author | kdx <kikoodx@paranoici.org> | 2023-06-10 18:27:52 +0200 |
---|---|---|
committer | kdx <kikoodx@paranoici.org> | 2023-06-10 18:27:52 +0200 |
commit | 905365181c7d61c5d79d065a8843e3d5358e0680 (patch) | |
tree | de9b4664800ac959439af540e3a33cbd77727543 | |
parent | 5e9f115e2d938a47a3d3db42188b837d4b57891a (diff) | |
download | golem-905365181c7d61c5d79d065a8843e3d5358e0680.tar.gz |
fix stack (i hate myself)
-rwxr-xr-x | run.sh | 2 | ||||
-rw-r--r-- | src/main.c | 29 | ||||
-rwxr-xr-x | testing.sh | 1 |
3 files changed, 21 insertions, 11 deletions
@@ -1,6 +1,6 @@ #!/bin/sh tup -q || exit 1 ./build/golem "$1" >build/tmp.orgaasm || exit 1 -orgaasm build/tmp.orgaasm build/tmp.rom -v || exit 1 +orgaasm build/tmp.orgaasm build/tmp.rom || exit 1 orgaemu build/tmp.rom #rm -f build/tmp.* @@ -819,7 +819,10 @@ gen_stmt(Node *node, Node *fname, int break_lbl) break; case NOD_RETURN_STMT: gen_expr(node->lhs); - printf("\tJMP ,__fnret_%.*s\n", fname->len, fname->loc); + if (locals_size) + printf("\tJMP ,__fnret_%.*s\n", fname->len, fname->loc); + else + printf("\tRET\n"); depth -= 1; break; case NOD_BREAK_STMT: @@ -887,9 +890,11 @@ gen_function(Node *node) locals_size = node_size(locals); - printf("\tLIT ,__stack_ptr LDA\n"); - printf("\tLIT %04x ADD\n", locals_size); - printf("\tLIT ,__stack_ptr STA\n"); + if (locals_size) { + printf("\tLIT ,__stack_ptr LDA\n"); + printf("\tLIT %04x ADD\n", locals_size); + printf("\tLIT ,__stack_ptr STA\n"); + } /* TODO: optimize this using DUP */ cur = locals; @@ -907,11 +912,13 @@ gen_function(Node *node) node = node->next; } - printf("\tLIT 0000 ( default return )\n"); - printf("@__fnret_%.*s\n", ognode->lhs->len, ognode->lhs->loc); - printf("\tLIT ,__stack_ptr LDA\n"); - printf("\tLIT %04x SUB\n", locals_size); - printf("\tLIT ,__stack_ptr STA\n"); + printf("\tLIT 0000\n"); + if (locals_size) { + printf("@__fnret_%.*s\n", ognode->lhs->len, ognode->lhs->loc); + printf("\tLIT ,__stack_ptr LDA\n"); + printf("\tLIT %04x SUB\n", locals_size); + printf("\tLIT ,__stack_ptr STA\n"); + } printf("\tRET\n"); } @@ -975,10 +982,12 @@ main(int argc, char **argv) Node *node = parse(tok); - printf("\tJRT ,__fn_main ( entry point )\n"); + printf("\tJRT ,__fn_main\n"); printf("\tRET\n"); codegen(node); printf("@__stack_ptr\n"); + printf("\t,__stack\n"); + printf("@__stack\n"); assert(depth == 0); return 0; @@ -22,6 +22,7 @@ test "$1" "global abc = 5; main(){ return abc; }" test "$1" "main(){ return abc; } global abc = 5;" test "$1" "global abc = 5; main(){ inc(); return abc; } inc() { abc = abc + 1; }" test "$1" "main() { wrt('H'); wrt('e'); wrt('l'); wrt('l'); wrt('o'); wrt('!'); wrt('\n'); }" +test "$1" "main() { a(a(0)); } a(x) { return x + 1; }" test "$1" "main() { wrt(inc(inc('0'))); wrt('\n'); } inc(x) { return x + 1; }" test "$1" "main() { wrt(up('u')); wrt('w'); wrt(up('u')); wrt('\n'); } up(c) { return c + 'A' - 'a'; }" test "$1" "main() { wrt(add('A' - 'a', 'u')); wrt('\n'); } add(a, b) { return a + b; }" |