/vm/gc_info.hpp

http://github.com/abeaumont/factor · C++ Header · 67 lines · 54 code · 13 blank · 0 comment · 0 complexity · fe32d5c9ad8fa5f2b77db372bebd5556 MD5 · raw file

  1. namespace factor
  2. {
  3. struct gc_info {
  4. u32 scrub_d_count;
  5. u32 scrub_r_count;
  6. u32 gc_root_count;
  7. u32 derived_root_count;
  8. u32 return_address_count;
  9. cell callsite_bitmap_size()
  10. {
  11. return scrub_d_count + scrub_r_count + gc_root_count;
  12. }
  13. cell total_bitmap_size()
  14. {
  15. return return_address_count * callsite_bitmap_size();
  16. }
  17. cell total_bitmap_bytes()
  18. {
  19. return ((total_bitmap_size() + 7) / 8);
  20. }
  21. u32 *return_addresses()
  22. {
  23. return (u32 *)this - return_address_count;
  24. }
  25. u32 *base_pointer_map()
  26. {
  27. return return_addresses() - return_address_count * derived_root_count;
  28. }
  29. u8 *gc_info_bitmap()
  30. {
  31. return (u8 *)base_pointer_map() - total_bitmap_bytes();
  32. }
  33. cell callsite_scrub_d(cell index)
  34. {
  35. return index * scrub_d_count;
  36. }
  37. cell callsite_scrub_r(cell index)
  38. {
  39. return return_address_count * scrub_d_count +
  40. index * scrub_r_count;
  41. }
  42. cell callsite_gc_roots(cell index)
  43. {
  44. return return_address_count * scrub_d_count
  45. + return_address_count * scrub_r_count
  46. + index * gc_root_count;
  47. }
  48. u32 lookup_base_pointer(cell index, cell derived_root)
  49. {
  50. return base_pointer_map()[index * derived_root_count + derived_root];
  51. }
  52. cell return_address_index(cell return_address);
  53. };
  54. }