default rel %include "src/ast.inc" extern panic extern vec_extend extern vec_get global codegen_function section .rdata SECTION_TEXT db "section .text", 10 SECTION_TEXT_LEN equ $ - SECTION_TEXT GLOBAL_ db "global " GLOBAL_LEN equ $ - GLOBAL_ COLON_NL db ":", 10 COLON_NL_LEN equ $ - COLON_NL RET_NL db "ret", 10 RET_NL_LEN equ $ - RET_NL section .text ;; start-structs ;; struct CodegenCtx { ;; ast: *const Ast, ;; text: Vec, ;; } ;; end-structs ;; rdi: *Ctx ;; rsi: function index ;; define-fn: fn codegen_function(ast: *const CodegenCtx, func_idx: u64) -> () codegen_function: push rbp mov rbp, rsp push rbx ; register-bitset [72..88] [a,b,c,d,di,si,sp,bp,8,9,10,11,12,13,14,15] ; stack-vars: Vec<(index, offset)> [32..72] ; current_stack_size: [24..32] ; func_idx [16..24] ; ast [8..16] ; ctx [0..8] sub rsp, 88 mov [rsp], rdi ; ctx mov rax, [rdi] mov [rsp + 8], rax ; ast mov [rsp + 16], rsi ; func_idx 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, [rdi + 8] ; &ctx.text lea rsi, [rel SECTION_TEXT] mov rdx, SECTION_TEXT_LEN call vec_extend mov rdi, [rsp + 8] ; ast mov rsi, [rsp + 16] ; func_idx call vec_get 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 + 8] ; &ctx.text lea rsi, [rel GLOBAL_] mov rdx, GLOBAL_LEN call vec_extend ; get function name mov rdi, [rsp] ; ctx 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 + 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 + 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 + 8] ; &ctx.text lea rsi, [rel COLON_NL] mov rdx, 2 call vec_extend ; TODO: generate function body ; push "ret\n" mov rdi, [rsp] ; ctx lea rdi, [rdi + 8] ; &ctx.text lea rsi, [rel RET_NL] mov rdx, RET_NL_LEN call vec_extend add rsp, 88 pop rbx pop rbp ret .panic: call panic