From 69aa1b02d3064813da5d19b13ffef231501d58ca Mon Sep 17 00:00:00 2001 From: kdx Date: Wed, 14 Jun 2023 20:21:15 +0200 Subject: cracked defines --- samples/define.golem | 8 +++++++ samples/malloc.golem | 6 +++-- src/main.c | 63 +++++++++++++++++++++++++++++++++++++++++++++------- 3 files changed, 67 insertions(+), 10 deletions(-) create mode 100644 samples/define.golem diff --git a/samples/define.golem b/samples/define.golem new file mode 100644 index 0000000..778a9c7 --- /dev/null +++ b/samples/define.golem @@ -0,0 +1,8 @@ +define A = 5; +define A_SQUARED = A * A; +define B = A - A_SQUARED + (A_SQUARED / A * 2); +global array[B]; + +main() { + dbg B; +} diff --git a/samples/malloc.golem b/samples/malloc.golem index 762f78f..27502d4 100644 --- a/samples/malloc.golem +++ b/samples/malloc.golem @@ -1,6 +1,7 @@ main() { local s; s = strdup("coucou le monde"); + dbg s; puts(s); stoupper(s); puts(s); @@ -37,9 +38,9 @@ strcpy(dst, src) { i = 0; loop { [dst + i] = [src + i]; - i = i + 1; if ([src + i] == 0) return dst; + i = i + 1; } } @@ -51,7 +52,8 @@ stoupper(s) { } } -global heap[4096] = 0x69; +define HEAP_SIZE = 4096; +global heap[HEAP_SIZE] = 0x69; global heap_size = 0; malloc(n) { local p; diff --git a/src/main.c b/src/main.c index 0d1e22c..9f55de1 100644 --- a/src/main.c +++ b/src/main.c @@ -337,7 +337,7 @@ new_num(int val) static Node *stmt(Token **rest, Token *tok); static Node *function(Token **rest, Token *tok); -void define(Token **rest, Token *tok); +static void define(Token **rest, Token *tok); static Node *global(Token **rest, Token *tok); static Node *local(Token **rest, Token *tok); static Node *expr(Token **rest, Token *tok); @@ -392,14 +392,14 @@ function(Token **rest, Token *tok) return node; } -void +static void define(Token **rest, Token *tok) { tok = skip(tok, "define"); Node *store = new_word(tok); tok = skip(tok->next, "="); - store->val = get_number(tok); - *rest = skip(tok->next, ";"); + store->rhs = expr(&tok, tok); + *rest = skip(tok, ";"); store->type = NOD_DEFINE; store->next = defines; @@ -417,8 +417,8 @@ global(Token **rest, Token *tok) if (equal(tok, "[")) { tok = tok->next; - node->lhs = new_num(get_number(tok)); - tok = skip(tok->next, "]"); + node->lhs = expr(&tok, tok); + tok = skip(tok, "]"); } if (equal(tok, "=")) { @@ -918,6 +918,8 @@ gen_expr(Node *node) printf("\t%s\n", op); } +static int const_expr(Node *node); + static void gen_globaldec(Node *node) { @@ -925,7 +927,8 @@ gen_globaldec(Node *node) if (node->lhs != NULL) { printf("\t,__gla_%.*s\n", node->len, node->loc); printf("@__gla_%.*s\n", node->len, node->loc); - for (int i = 0; i < node->lhs->val; i++) + const int len = const_expr(node->lhs); + for (int i = 0; i < len; i++) printf("\t%04x\n", node->val); } else printf("\t%04x\n", node->val); @@ -950,6 +953,49 @@ gen_fncall(Node *node) } } +static int +get_define(Node *node) +{ + const int define_idx = node_find(defines, node); + if (define_idx != -1) + return const_expr(node_get(defines, define_idx)->rhs); + error("define '%.*s doesn't exist\n", node->len, node->loc); + return 0; +} + +static int +const_expr(Node *node) +{ + Node *const lhs = node->lhs; + Node *const rhs = node->rhs; + + switch (node->type) { + case NOD_ADD: return const_expr(lhs) + const_expr(rhs); + case NOD_SUB: return const_expr(lhs) - const_expr(rhs); + case NOD_MUL: return const_expr(lhs) * const_expr(rhs); + case NOD_DIV: return const_expr(lhs) / const_expr(rhs); + case NOD_EQU: return const_expr(lhs) == const_expr(rhs); + case NOD_NEQ: return const_expr(lhs) != const_expr(rhs); + case NOD_LT: return const_expr(lhs) < const_expr(rhs); + case NOD_LTE: return const_expr(lhs) <= const_expr(rhs); + case NOD_GT: return const_expr(lhs) > const_expr(rhs); + case NOD_GTE: return const_expr(lhs) >= const_expr(rhs); + case NOD_AND: return const_expr(lhs) & const_expr(rhs); + case NOD_OR: return const_expr(lhs) | const_expr(rhs); + case NOD_XOR: return const_expr(lhs) ^ const_expr(rhs); + default: break; + } + + switch (node->type) { + case NOD_NUM: return node->val; + case NOD_WORD: return get_define(node); + default: break; + } + + error("const expr doesn't support %d expression", node->type); + return 0; +} + static void gen_variableget(Node *node) { @@ -957,7 +1003,8 @@ gen_variableget(Node *node) const int found = node_find(locals, node); if (define_idx != -1) - printf("\tLIT %04x\n", node_get(defines, define_idx)->val); + printf("\tLIT %04x\n", + (unsigned)const_expr(node_get(defines, define_idx)->rhs) % 0x10000); else if (found != -1) { printf("\tLIT ,__stack_ptr LDA\n"); if (locals_size - found - 1) -- cgit v1.2.3