From 07b352ff545427881c32d6dd8b03539025bbca80 Mon Sep 17 00:00:00 2001 From: Ian Moffett Date: Thu, 2 Oct 2025 19:05:33 -0400 Subject: np: codegen: Implement initial stack based codegen This commit introduces the groundwork for the AMD64 PIIR backend. We will not follow through with the plans of using abstract syntax trees as they'll overly complicate the project. Instead we'll utilize a ring buffer to store the list of instructions and a stack machine for the IR code. Signed-off-by: Ian Moffett --- src/sys/np/core/np_parse.c | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) (limited to 'src/sys/np/core') diff --git a/src/sys/np/core/np_parse.c b/src/sys/np/core/np_parse.c index fd35e3c..3eefde5 100644 --- a/src/sys/np/core/np_parse.c +++ b/src/sys/np/core/np_parse.c @@ -269,16 +269,16 @@ parse_proc(struct np_work *work, struct ast_node **npp, struct lex_token *tok) * Parse a token * * @work: Input work - * @root: Root AST node * @tok: Current token */ static int -parse_token(struct np_work *work, struct ast_node *root, struct lex_token *tok) +parse_token(struct np_work *work, struct lex_token *tok) { tt_t tt; int error; struct ast_node *np; +#define PIIR_PUSH(BYTE) piir_push(work->piir_stack, (BYTE)) /* * XXX: wrapped in "[]" indicates optional * @@ -296,9 +296,15 @@ parse_token(struct np_work *work, struct ast_node *root, struct lex_token *tok) ++work->begin_depth; case TT_END: - /* Do the begin statements match? */ + /* + * Check if the 'begin' statements match, if they do + * we'll decrease the depth and push a NIL return + * + * TODO: We'll need to handle returns better + */ if (work->begin_depth > 0) { --work->begin_depth; + PIIR_PUSH(PIIR_RET_NIL); break; } @@ -321,18 +327,17 @@ parse_token(struct np_work *work, struct ast_node *root, struct lex_token *tok) return -1; } - root->left = NULL; /* arguments */ - root->right = np; + /* XXX: NOP for testing */ + PIIR_PUSH(PIIR_NOP); break; } - +#undef PIIR_PUSH return 0; } int parse_work(struct np_work *work) { - struct ast_node *root; struct lex_token tok; int error = 0; @@ -341,14 +346,6 @@ parse_work(struct np_work *work) return -EINVAL; } - /* Get the AST root node */ - work->ast_root = ast_alloc(work); - root = work->ast_root; - if (work->ast_root == NULL) { - pr_error("failed to alloc root AST\n"); - return -ENOMEM; - } - /* Initialize PIIR */ error = piir_stack_new(work, &work->piir_stack); if (error < 0) { @@ -371,11 +368,13 @@ parse_work(struct np_work *work) return -1; } - if (parse_token(work, root, &tok) < 0) { + if (parse_token(work, &tok) < 0) { return -1; } } + piir_inject(work); + /* * If there are more begin clauses than end * clauses, someone mismatched them. -- cgit v1.2.3