More precise stack marking via .guile.frame-maps section
authorAndy Wingo <wingo@pobox.com>
Sun, 26 Jan 2014 19:55:04 +0000 (20:55 +0100)
committerAndy Wingo <wingo@pobox.com>
Sun, 26 Jan 2014 19:55:04 +0000 (20:55 +0100)
commit02c624fc09079491660317977a5f202ecc2b1fc8
treec7b70b76408eaf633a2e1537e589be11ca9b96d4
parentb3f1bb5d31a85447c4e7f6084a4f8d7ea374bdbe
More precise stack marking via .guile.frame-maps section

* module/language/cps/slot-allocation.scm (lookup-dead-slot-map)
  (allocate-slots): For each non-tail call in a function, compute the
  set of slots that are dead after the function has begun the call.

* module/language/cps/compile-bytecode.scm (compile-fun): Emit the
  `dead-slot-map' macro instruction for non-tail calls.

* module/system/vm/assembler.scm (<asm>): Add `dead-slot-maps' member.
  (dead-slot-map): New macro-instruction.
  (link-frame-maps, link-dynamic-section, link-objects): Write dead
  slots information into .guile.frame-maps sections of ELF files.
* module/system/vm/elf.scm (DT_GUILE_FRAME_MAPS): New definition.

* libguile/loader.h:
* libguile/loader.c (DT_GUILE_FRAME_MAPS, process_dynamic_segment):
  (load_thunk_from_memory, register_elf): Arrange to parse
  DT_GUILE_FRAME_MAPS out of the dynamic section.
  (find_mapped_elf_image_unlocked, find_mapped_elf_image): New helpers.
  (scm_find_mapped_elf_image): Refactor.
  (scm_find_dead_slot_map_unlocked): New interface.

* libguile/vm.c (scm_i_vm_mark_stack): Mark the hottest frame
  conservatively, as before.  Otherwise use the dead slots map, if
  available, to avoid marking data that isn't live.
libguile/loader.c
libguile/loader.h
libguile/vm.c
module/language/cps/compile-bytecode.scm
module/language/cps/slot-allocation.scm
module/system/vm/assembler.scm
module/system/vm/elf.scm