.ifndef _data_s_file _data_s_file: # Simple values and boxed machine integers # | ptr | value | CON_evacuate1: retq # TODO CON_scavenge1: retq # Format of the info tables: # - code # ----- code pointer # - 8B helper information for eval/apply (generally this is 0, and only gets used for FUN/PAP) # - 8B pointer to scavenge # - 8B pointer to evacuate INT_info_table: cell CON_evacuate1 cell CON_scavenge1 cell 0 INT_code: continue # List # | ptr | 0 | # | ptr | 1 | a | b | LIST_evacuate: # [] | a : b retq #TODO LIST_scavenge: mov 010(%rbp), %rax shl $1, %rax add $2, %rax shl $3, %rax add %rax, %rsi retq LIST_info_table: cell LIST_evacuate cell LIST_scavenge cell 0 LIST_code: continue # FUN objects # | ptr | thunkptr | args | arg[0] | arg[1] | ... | arg[args] | FUN_evacuate: retq #TODO FUN_scavenge: mov 020(%rbp), %rax add $3, %rax shl $3, %rax add %rax, %rsi retq # Info tables for FUN objects. FUN0_info_table: cell FUN_evacuate cell FUN_scavenge cell 0 FUN0_code: continue FUN1_info_table: cell FUN_evacuate cell FUN_scavenge cell 1 FUN1_code: continue FUN2_info_table: cell FUN_evacuate cell FUN_scavenge cell 2 FUN2_code: continue FUN3_info_table: cell FUN_evacuate cell FUN_scavenge cell 3 FUN3_code: continue FUN4_info_table: cell FUN_evacuate cell FUN_scavenge cell 4 FUN4_code: continue # TODO: add more funN here as needed # indirection (Q: how to recognize IND and THUNK on return?) # | ptr | indptr | IND_evacuate: retq #TODO IND_scavenge: add $020,%rsi retq IND_info: cell IND_evacuate cell IND_scavenge cell 0 IND_code: enter 010(%rbp) # THU objects (gc implementation only, actual THUs are defined by functions) # | ptr | args | arg[0] | arg[1] | ... | arg[args] | # args wouldn't need to be here but let's keep them for gc simplicity THU_evacuate: retq #TODO THU_scavenge: mov 010(%rbp), %rax add $2,%rax shl $3,%rax add %rax,%rsi retq .endif # _data_s_file # evacuate and scavenge: # - evacuate just copies the object # - scavenge evacuates all children (to the new location IF they are in the old # location), changes the pointer, and moves the scavenge pointer to the next # object (because everything needs to be scavenged)