]> gitweb.factorcode.org Git - factor.git/blob - vm/gc_info.hpp
GC maps for more compact inline GC checks
[factor.git] / vm / gc_info.hpp
1 namespace factor
2 {
3
4 struct gc_info {
5         u32 scrub_d_count;
6         u32 scrub_r_count;
7         u32 gc_root_count;
8         u32 return_address_count;
9
10         cell total_bitmap_size()
11         {
12                 return return_address_count * (scrub_d_count + scrub_r_count + gc_root_count);
13         }
14
15         cell total_bitmap_bytes()
16         {
17                 return ((total_bitmap_size() + 7) / 8);
18         }
19
20         u32 *return_addresses()
21         {
22                 return (u32 *)((u8 *)this - return_address_count * sizeof(u32));
23         }
24
25         u8 *gc_info_bitmap()
26         {
27                 return (u8 *)return_addresses() - total_bitmap_bytes();
28         }
29
30         cell scrub_d_base(cell index)
31         {
32                 return index * scrub_d_count;
33         }
34
35         cell scrub_r_base(cell index)
36         {
37                 return return_address_count * scrub_d_count +
38                         index * scrub_r_count;
39         }
40
41         cell spill_slot_base(cell index)
42         {
43                 return return_address_count * scrub_d_count
44                         + return_address_count * scrub_r_count
45                         + index * gc_root_count;
46         }
47
48         int return_address_index(u32 return_address);
49 };
50
51 }