fix issues with initial codegen
This commit is contained in:
parent
d5de30d9e7
commit
e3e0d6843f
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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]")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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) -> ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue