Patch title: Release 84 bulk changes
Abstract:
File: /pliant/language/memory/memory_bench.pli
Key:
    Removed line
    Added line
abstract
  [This is a crazy memory allocation replacement where memory is not recovered at all.] ; eol
  [It is designed mainly for running benchmarks.] ; eol
  [It is also not thread safe.]

doc
  [Use it through something like:]
  listing
    module "/pliant/language/memory/memory_bench.pli"
    memory_bench 0.25
  [0.25 means allocate 25% of the overall memory available in the computer.]


module "/pliant/language/compiler.pli"
module "/pliant/language/context.pli"
module "/pliant/language/os.pli"
module "/pliant/language/misc/hooks.pli"

gvar Address base current stop
constant align 8

function out_of_memory
  console "Out of benchmark memory[lf]"
  os_exit 1

function memory_allocate_bench size with -> mem
  arg Int size ; arg Address with mem
  if size=0
    return null
  var Int reserve := size+Int:size+align-1 .and. .not. align-1
  if ((cast stop Int) .-. (cast current Int))<reserve
    out_of_memory
  current map Int := reserve
  mem := current translate Int 1
  current := current translate Byte reserve
entry_root addressof:(the_function memory_allocate_bench Int Address -> Address)
  
function memory_free_bench mem
  arg Address mem
entry_root addressof:(the_function memory_free_bench Address)
  
function memory_resize_bench oldmem size with -> mem
  arg Address oldmem ; arg Int size ; arg Address with mem
  if oldmem=null
    return (memory_allocate_bench size with)
  var Int oldsize := oldmem map Int -1
  if size>oldsize
    mem := memory_allocate_bench size with
    memory_copy oldmem mem oldsize
  else
    mem := oldmem
entry_root addressof:(the_function memory_resize_bench Address Int Address -> Address)
  
function memory_checkup_bench
  void
entry_root addressof:(the_function memory_checkup_bench)
  
function memory_shrink_bench clear
  arg CBool clear
  void
entry_root addressof:(the_function memory_shrink_bench CBool)
  
function memory_enumerate_bench hook
  arg Address hook
  void
entry_root addressof:(the_function memory_enumerate_bench Address)
  
function memory_bench factor
  arg Float factor
  var Int size := (min (cast (cast memory_physical\2^20 Int)*factor Int) 2047)*2^20
  var Int size := (min (cast (cast memory_assigned\2^20 Int)*factor Int) 2047)*2^20
  console "Allocating " size\2^20 " MB or RAM for memory allocation speedup." eol
  base := memory_zallocate size null
  current := base
  stop := base translate Byte size
  pliant_memory_allocate_hook := (the_function memory_allocate_bench Int Address -> Address) executable
  pliant_memory_zallocate_hook := (the_function memory_allocate_bench Int Address -> Address) executable
  pliant_memory_free_hook := (the_function memory_free_bench Address) executable
  pliant_memory_resize_hook := (the_function memory_resize_bench Address Int Address -> Address) executable
  pliant_memory_zresize_hook := (the_function memory_resize_bench Address Int Address -> Address) executable
  pliant_memory_checkup_hook := (the_function memory_checkup_bench) executable
  pliant_memory_shrink_hook := (the_function memory_shrink_bench CBool) executable
  pliant_memory_enumerate_hook := (the_function memory_enumerate_bench Address) executable

export memory_bench