From 36cc302d99a70e9985dab86576d963fe06855090 Mon Sep 17 00:00:00 2001 From: nub31 Date: Mon, 3 Feb 2025 23:02:05 +0100 Subject: [PATCH] update gc to use alloc. Still buggy --- input/baseline/gc.asm | 99 +++++++++++-------------------------------- 1 file changed, 24 insertions(+), 75 deletions(-) diff --git a/input/baseline/gc.asm b/input/baseline/gc.asm index 079c18c..cc91e5f 100644 --- a/input/baseline/gc.asm +++ b/input/baseline/gc.asm @@ -1,13 +1,12 @@ global gc_init, gc_alloc +extern alloc, free section .bss alloc_list: resq 1 ; head of alloc list stack_start: resq 1 ; start of stack section .data - gc_threshold_b: dq 4096 ; default of 4096 bytes, this will scale when gc_collect is ran - gc_threshold_c: dq 1024 ; default of 1024 allocations - total_alloc_b: dq 0 ; counts the allocated bytes + gc_threshold_c: dq 1024 ; default of 1024 allocations total_alloc_c: dq 0 ; count the amount of allocations section .text @@ -17,22 +16,16 @@ gc_init: gc_alloc: add rdi, 24 ; add space for metadata - mov rdx, [total_alloc_b] ; load total allocations in bytes - cmp rdx, [gc_threshold_b] ; has total exceeded threshold? - jae .collect ; yes? run gc mov rdx, [total_alloc_c] ; load total allocation count cmp rdx, [gc_threshold_c] ; has count exceeded threshold? - jae .collect ; yes? run gc - jmp .collect_end -.collect: + jb .skip_collect ; yes? run gc push rdi call gc_collect pop rdi -.collect_end: - add [total_alloc_b], rdi ; update total allocated bytes +.skip_collect: inc qword [total_alloc_c] ; update total allocation count push rdi - call sys_mmap ; allocate size + metadata + call alloc ; allocate size + metadata pop rdi mov byte [rax], 0 ; set mark to 0 mov qword [rax + 8], rdi ; set total size of object (including metadata) @@ -45,12 +38,7 @@ gc_alloc: gc_collect: call gc_mark_stack call gc_sweep - mov qword [total_alloc_c], 0 ; reset allocation count - mov rdi, [total_alloc_b] ; since we just swept, all the memory is in use - shl rdi, 1 ; double the currently used memory - mov rsi, 4096 - call max ; get the largest of total_alloc_b * 2 and 4096 - mov qword [gc_threshold_b], rax ; update threshold to new value + mov qword [total_alloc_c], 0 ; reset allocation count ret gc_mark_stack: @@ -58,10 +46,10 @@ gc_mark_stack: mov r9, [stack_start] ; load start of stack .loop: cmp r8, r9 ; have we reached end of stack? - ja .done ; yes? return + jae .done ; yes? return mov rdi, [r8] ; no? load the value call gc_mark ; this might be an allocation, check - add r8, 8 ; next item in stack + lea r8, [r8 + 8] ; next item in stack jmp .loop .done: ret @@ -100,68 +88,29 @@ gc_sweep: mov rdi, [alloc_list] xor rsi, rsi .loop: - test rdi, rdi ; reached end of list? - jz .done ; yes? return + test rdi, rdi ; reached end of list? + jz .done ; yes? return mov al, [rdi] - test al, al ; is object marked? - jz .free ; no? free it - mov byte [rdi], 0 ; yes? clear mark for next marking + test al, al ; is object marked? + jz .free ; no? free it + mov byte [rdi], 0 ; yes? clear mark for next marking mov rsi, rdi - mov rdi, [rdi + 16] ; load the next object in the list - jmp .loop ; repeat + mov rdi, [rdi + 16] ; load the next object in the list + jmp .loop ; repeat .free: - mov rdx, [rdi + 16] ; save address of next object in list + mov rdx, [rdi + 16] ; save address of next object in list test rsi, rsi jz .remove_head - mov [rsi + 16], rdx ; unlink the current node by setting the previous node's next to the next node's address + mov [rsi + 16], rdx ; unlink the current node by setting the previous node's next to the next node's address jmp .free_memory .remove_head: - mov [alloc_list], rdx ; update head node to be the next node + mov [alloc_list], rdx ; update head node to be the next node .free_memory: - push rsi ; save previous node since it will also be the previous node for the next item - push rdx ; save next node - mov rsi, [rdi + 8] ; get length of the object - sub [total_alloc_b], rsi ; remove this allocation from total allocations - call sys_munmap ; free the memory - pop rdi ; input for next iteration - pop rsi ; prev node for next iteration + push rsi ; save previous node since it will also be the previous node for the next item + push rdx ; save next node + call free ; free the memory + pop rdi ; input for next iteration + pop rsi ; prev node for next iteration jmp .loop .done: - ret - -sys_mmap: - mov rax, 9 - mov rsi, rdi - mov rdi, 0 - mov rdx, 3 - mov r10, 34 - mov r8, -1 - mov r9, 0 - syscall - cmp rax, -1 - je .error - ret -.error: - mov rax, 60 - mov rdi, 1 - syscall - -sys_munmap: - mov rax, 11 - syscall - cmp rax, -1 - je .error - ret -.error: - mov rax, 60 - mov rdi, 1 - syscall - -max: - cmp rdi, rsi - jae .left - mov rax, rsi - ret -.left: - mov rax, rdi - ret + ret \ No newline at end of file