fix issues with initial codegen

This commit is contained in:
janis 2025-10-31 16:03:28 +01:00
parent d5de30d9e7
commit e3e0d6843f
Signed by: janis
SSH key fingerprint: SHA256:bB1qbbqmDXZNT0KKD5c2Dfjg53JGhj7B3CFcLIzSqq8
5 changed files with 31 additions and 38 deletions

View file

@ -1,7 +1,7 @@
# Makefile: Compile and link main.asm using nasm and mold, intermediate files in target/ # Makefile: Compile and link main.asm using nasm and mold, intermediate files in target/
TARGET_DIR := 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)) OBJ := $(patsubst src/%.asm,$(TARGET_DIR)/%.o,$(SRC))
BIN_SRC := src/main.asm src/panic.asm BIN_SRC := src/main.asm src/panic.asm

View file

@ -1,13 +1,15 @@
default rel default rel
%include "ast.inc" %include "src/ast.inc"
extern panic extern panic
extern vec_extend extern vec_extend
extern vec_get extern vec_get
global codegen_function
section .rdata section .rdata
SECTION_TEXT db "section .text\n" SECTION_TEXT db "section .text", 10
SECTION_TEXT_LEN equ $ - SECTION_TEXT SECTION_TEXT_LEN equ $ - SECTION_TEXT
GLOBAL_ db "global " GLOBAL_ db "global "
GLOBAL_LEN equ $ - GLOBAL_ GLOBAL_LEN equ $ - GLOBAL_
@ -26,7 +28,7 @@ section .text
;; rdi: *Ctx ;; rdi: *Ctx
;; rsi: function index ;; 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: codegen_function:
push rbp push rbp
mov rbp, rsp mov rbp, rsp
@ -44,12 +46,12 @@ codegen_function:
mov [rsp + 8], rax ; ast mov [rsp + 8], rax ; ast
mov [rsp + 16], rsi ; func_idx mov [rsp + 16], rsi ; func_idx
bts [rsp + 72], 7 ; mark rbp as used bts qword [rsp + 72], 7 ; mark rbp as used
bts [rsp + 72], 6 ; mark rsp as used bts qword [rsp + 72], 6 ; mark rsp as used
; push "section .text\n" ; push "section .text\n"
mov rdi, [rsp] ; ctx mov rdi, [rsp] ; ctx
lea rdi, [rsp + 8] ; &ctx.text lea rdi, [rdi + 8] ; &ctx.text
lea rsi, [rel SECTION_TEXT] lea rsi, [rel SECTION_TEXT]
mov rdx, SECTION_TEXT_LEN mov rdx, SECTION_TEXT_LEN
call vec_extend call vec_extend
@ -57,38 +59,38 @@ codegen_function:
mov rdi, [rsp + 8] ; ast mov rdi, [rsp + 8] ; ast
mov rsi, [rsp + 16] ; func_idx mov rsi, [rsp + 16] ; func_idx
call vec_get call vec_get
cmp [rax + 0], AST_FUNCTION ; AstNode.kind cmp byte [rax + 0], AST_FUNCTION ; AstNode.kind
mov rbx, [rax + 8] ; AstNode.data mov rbx, [rax + 8] ; AstNode.data
jne .panic jne .panic
; push "global {function_name}\n" ; push "global {function_name}\n"
mov rdi, [rsp] ; ctx mov rdi, [rsp] ; ctx
lea rdi, [rdi] ; &ctx.text lea rdi, [rdi + 8] ; &ctx.text
lea rsi, [rel GLOBAL_] lea rsi, [rel GLOBAL_]
mov rdx, GLOBAL_LEN mov rdx, GLOBAL_LEN
call vec_extend call vec_extend
; get function name ; get function name
mov rdi, [rsp] ; ctx mov rdi, [rsp] ; ctx
lea rdi, [rdi] ; &ctx.text lea rdi, [rdi + 8] ; &ctx.text
mov rsi, [rbx + 0] ; AstFunction.name mov rsi, [rbx + 0] ; AstFunction.name
mov rdx, [rbx + 8] ; AstFunction.name_len mov rdx, [rbx + 8] ; AstFunction.name_len
call vec_extend call vec_extend
; push "\n" ; push "\n"
mov rdi, [rsp] ; ctx mov rdi, [rsp] ; ctx
lea rdi, [rdi] ; &ctx.text lea rdi, [rdi + 8] ; &ctx.text
lea rsi, [rel COLON_NL] lea rsi, [rel COLON_NL]
inc rsi inc rsi
mov rdx, 1 mov rdx, 1
call vec_extend call vec_extend
; push "{function_name}:\n" ; push "{function_name}:\n"
mov rdi, [rsp] ; ctx mov rdi, [rsp] ; ctx
lea rdi, [rdi] ; &ctx.text lea rdi, [rdi + 8] ; &ctx.text
mov rsi, [rbx + 0] ; AstFunction.name mov rsi, [rbx + 0] ; AstFunction.name
mov rdx, [rbx + 8] ; AstFunction.name_len mov rdx, [rbx + 8] ; AstFunction.name_len
call vec_extend call vec_extend
; push ":\n" ; push ":\n"
mov rdi, [rsp] ; ctx mov rdi, [rsp] ; ctx
lea rdi, [rdi] ; &ctx.text lea rdi, [rdi + 8] ; &ctx.text
lea rsi, [rel COLON_NL] lea rsi, [rel COLON_NL]
mov rdx, 2 mov rdx, 2
call vec_extend call vec_extend
@ -98,13 +100,13 @@ codegen_function:
; push "ret\n" ; push "ret\n"
mov rdi, [rsp] ; ctx mov rdi, [rsp] ; ctx
lea rdi, [rdi] ; &ctx.text lea rdi, [rdi + 8] ; &ctx.text
lea rsi, [rel RET_NL] lea rsi, [rel RET_NL]
mov rdx, RET_NL_LEN mov rdx, RET_NL_LEN
call vec_extend call vec_extend
pop rbx
add rsp, 88 add rsp, 88
pop rbx
pop rbp pop rbp
ret ret

View file

@ -30,33 +30,24 @@ fn main() {
}; };
let expr_id = parser(&mut ast); let expr_id = parser(&mut ast);
eprintln!("Parsed expression ID: {}", expr_id); 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::<util::defs::SymbolTable>::uninit(); let mut symtable = core::mem::MaybeUninit::<util::defs::SymbolTable>::uninit();
util::defs::ast_build_symtable(&mut ast, expr_id, &mut symtable); util::defs::ast_build_symtable(&mut ast, expr_id, &mut symtable);
let mut symtable = symtable.assume_init(); 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); util::defs::ast_resolve_var_refs(&mut ast, &mut symtable, expr_id);
println!("{:#}", &ast); 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()
);
}; };
} }

View file

@ -118,7 +118,7 @@ impl core::fmt::Display for util::defs::Ast {
} }
write!(f, "\t{i}: {}", item)?; write!(f, "\t{i}: {}", item)?;
} }
writeln!(f, "\n]") write!(f, "\n]")
} }
} }

View file

@ -17,7 +17,7 @@ unsafe extern "C" {
pub unsafe fn ast_build_symtable(ast: *mut Ast, root_index: u64, symtable: *mut core::mem::MaybeUninit<SymbolTable>); pub unsafe fn ast_build_symtable(ast: *mut Ast, root_index: u64, symtable: *mut core::mem::MaybeUninit<SymbolTable>);
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_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 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) -> (); pub unsafe fn vec_extend(vec: *mut BlobVec, elements: *const u8, count: usize) -> ();
} }