From e3e0d6843f98708e3d003691d34591786eb965dd Mon Sep 17 00:00:00 2001 From: janis Date: Fri, 31 Oct 2025 16:03:28 +0100 Subject: [PATCH] fix issues with initial codegen --- lang/Makefile | 2 +- lang/src/codegen.asm | 30 ++++++++++++++++-------------- lang/tests/codegen.rs | 33 ++++++++++++--------------------- lang/tests/shared/ast_debug.rs | 2 +- lang/tests/shared/defs.rs | 2 +- 5 files changed, 31 insertions(+), 38 deletions(-) diff --git a/lang/Makefile b/lang/Makefile index 5b6af70..1b06fcb 100644 --- a/lang/Makefile +++ b/lang/Makefile @@ -1,7 +1,7 @@ # Makefile: Compile and link main.asm using nasm and mold, intermediate files in target/ TARGET_DIR := target -SRC := src/lib.asm src/int_to_str.asm src/vec.asm src/tokeniser.asm src/file.asm src/alloc.asm src/ast.asm +SRC := src/lib.asm src/int_to_str.asm src/vec.asm src/tokeniser.asm src/file.asm src/alloc.asm src/ast.asm src/codegen.asm OBJ := $(patsubst src/%.asm,$(TARGET_DIR)/%.o,$(SRC)) BIN_SRC := src/main.asm src/panic.asm diff --git a/lang/src/codegen.asm b/lang/src/codegen.asm index c16c005..bd6e401 100644 --- a/lang/src/codegen.asm +++ b/lang/src/codegen.asm @@ -1,13 +1,15 @@ default rel -%include "ast.inc" +%include "src/ast.inc" extern panic extern vec_extend extern vec_get +global codegen_function + section .rdata - SECTION_TEXT db "section .text\n" + SECTION_TEXT db "section .text", 10 SECTION_TEXT_LEN equ $ - SECTION_TEXT GLOBAL_ db "global " GLOBAL_LEN equ $ - GLOBAL_ @@ -26,7 +28,7 @@ section .text ;; rdi: *Ctx ;; rsi: function index -;; define-fn: fn codegen_function(ast: *const CodegenCtx, func_idx: usize) -> () +;; define-fn: fn codegen_function(ast: *const CodegenCtx, func_idx: u64) -> () codegen_function: push rbp mov rbp, rsp @@ -44,12 +46,12 @@ codegen_function: mov [rsp + 8], rax ; ast mov [rsp + 16], rsi ; func_idx - bts [rsp + 72], 7 ; mark rbp as used - bts [rsp + 72], 6 ; mark rsp as used + bts qword [rsp + 72], 7 ; mark rbp as used + bts qword [rsp + 72], 6 ; mark rsp as used ; push "section .text\n" mov rdi, [rsp] ; ctx - lea rdi, [rsp + 8] ; &ctx.text + lea rdi, [rdi + 8] ; &ctx.text lea rsi, [rel SECTION_TEXT] mov rdx, SECTION_TEXT_LEN call vec_extend @@ -57,38 +59,38 @@ codegen_function: mov rdi, [rsp + 8] ; ast mov rsi, [rsp + 16] ; func_idx call vec_get - cmp [rax + 0], AST_FUNCTION ; AstNode.kind + cmp byte [rax + 0], AST_FUNCTION ; AstNode.kind mov rbx, [rax + 8] ; AstNode.data jne .panic ; push "global {function_name}\n" mov rdi, [rsp] ; ctx - lea rdi, [rdi] ; &ctx.text + lea rdi, [rdi + 8] ; &ctx.text lea rsi, [rel GLOBAL_] mov rdx, GLOBAL_LEN call vec_extend ; get function name mov rdi, [rsp] ; ctx - lea rdi, [rdi] ; &ctx.text + lea rdi, [rdi + 8] ; &ctx.text mov rsi, [rbx + 0] ; AstFunction.name mov rdx, [rbx + 8] ; AstFunction.name_len call vec_extend ; push "\n" mov rdi, [rsp] ; ctx - lea rdi, [rdi] ; &ctx.text + lea rdi, [rdi + 8] ; &ctx.text lea rsi, [rel COLON_NL] inc rsi mov rdx, 1 call vec_extend ; push "{function_name}:\n" mov rdi, [rsp] ; ctx - lea rdi, [rdi] ; &ctx.text + lea rdi, [rdi + 8] ; &ctx.text mov rsi, [rbx + 0] ; AstFunction.name mov rdx, [rbx + 8] ; AstFunction.name_len call vec_extend ; push ":\n" mov rdi, [rsp] ; ctx - lea rdi, [rdi] ; &ctx.text + lea rdi, [rdi + 8] ; &ctx.text lea rsi, [rel COLON_NL] mov rdx, 2 call vec_extend @@ -98,13 +100,13 @@ codegen_function: ; push "ret\n" mov rdi, [rsp] ; ctx - lea rdi, [rdi] ; &ctx.text + lea rdi, [rdi + 8] ; &ctx.text lea rsi, [rel RET_NL] mov rdx, RET_NL_LEN call vec_extend - pop rbx add rsp, 88 + pop rbx pop rbp ret diff --git a/lang/tests/codegen.rs b/lang/tests/codegen.rs index d786539..d43383e 100644 --- a/lang/tests/codegen.rs +++ b/lang/tests/codegen.rs @@ -30,33 +30,24 @@ fn main() { }; let expr_id = parser(&mut ast); eprintln!("Parsed expression ID: {}", expr_id); - println!("{:#}", &ast); - - // unsafe extern "C" fn visit_node( - // _this: *mut (), - // ast: *mut Ast, - // node_id: u64, - // scope: u64, - // ) { - // let ast = unsafe { &*ast }; - // let node = ast.nodes.get(node_id as usize).unwrap(); - // eprintln!("{scope}: Visiting node {node_id}: {node}"); - // } - - // util::defs::ast_walk_for_each(&mut ast, expr_id, core::ptr::null_mut(), visit_node); - let mut symtable = core::mem::MaybeUninit::::uninit(); util::defs::ast_build_symtable(&mut ast, expr_id, &mut symtable); let mut symtable = symtable.assume_init(); - use util::DisplayedSliceExt; - println!( - "Symbol Table: {:#?}", - symtable.symtable.as_slice().displayed() - ); - util::defs::ast_resolve_var_refs(&mut ast, &mut symtable, expr_id); println!("{:#}", &ast); + + let mut codegen = util::defs::CodegenCtx { + ast: &mut ast, + text: util::vec::Vec::new(), + }; + + util::defs::codegen_function(&mut codegen, expr_id); + + println!( + "Generated code:\n{}", + core::str::from_utf8(codegen.text.as_slice()).unwrap() + ); }; } diff --git a/lang/tests/shared/ast_debug.rs b/lang/tests/shared/ast_debug.rs index 81dc2b1..700a6a0 100644 --- a/lang/tests/shared/ast_debug.rs +++ b/lang/tests/shared/ast_debug.rs @@ -118,7 +118,7 @@ impl core::fmt::Display for util::defs::Ast { } write!(f, "\t{i}: {}", item)?; } - writeln!(f, "\n]") + write!(f, "\n]") } } diff --git a/lang/tests/shared/defs.rs b/lang/tests/shared/defs.rs index 838b5c3..e4a83cf 100644 --- a/lang/tests/shared/defs.rs +++ b/lang/tests/shared/defs.rs @@ -17,7 +17,7 @@ unsafe extern "C" { pub unsafe fn ast_build_symtable(ast: *mut Ast, root_index: u64, symtable: *mut core::mem::MaybeUninit); pub unsafe fn ast_walk_for_each(ast: *mut Ast, start_index: u64, ctx: *mut (), for_each: unsafe extern "C" fn(ctx: *mut (), *mut Ast, node_index: u64, scope: u64)); pub unsafe fn ast_resolve_var_refs(ast: *mut Ast, ctx: *mut SymbolTable, root_index: u64); - pub unsafe fn codegen_function(ast: *const CodegenCtx, func_idx: usize) -> (); + pub unsafe fn codegen_function(ast: *const CodegenCtx, func_idx: u64) -> (); pub unsafe fn vec_extend(vec: *mut BlobVec, elements: *const u8, count: usize) -> (); }