Files
mercury/runtime/machdeps
Tyson Dowd 376f2c69af An initial implementation of the accurate garbage collector.
Estimated hours taken: 90

An initial implementation of the accurate garbage collector.

WORK_IN_PROGRESS:
	Add an entry for the accurate garbage collector.

library/builtin.m:
library/mercury_builtin.m:
library/std_util.m:
runtime/mercury_tabling.h:
	Deep copy terms using the address of the value instead of
	just the value.

library/io.m:
	Initialize the garbage collector's rootset with the globals.

runtime/Mmakefile:
	Add new files to the Mmakefile.

runtime/mercury_accurate_gc.h:
runtime/mercury_accurate_gc.c:
	The new garbage collector.

runtime/mercury_agc_debug.c:
runtime/mercury_agc_debug.h:
	Debugging utilities for the new garbage collector.

runtime/mercury_deep_copy.c:
runtime/mercury_deep_copy.h:
runtime/mercury_deep_copy_body.h:
	Put the deep copy code in mercury_deep_copy_body.h, and #include
	it with appropriate #defines in order to get a variant for
	deep_copy(), and one for agc_deep_copy().

	agc_deep_copy() forwards pointers as it copies.

	Also, deep_copy (all variants) have been modified to take
	a pointer to the data to be copied, because some variants
	need to be able to modify it.

runtime/mercury_engine.c:
runtime/mercury_engine.h:
	Add a second heap_zone which is the to-space of
	the copying collector.
	Add a debug_heap_zone, which is used as a scratch
	heap for debugging.

runtime/mercury_label.c:
	Instead of
		realloc(entry_table, ....)
	do
		entry_table = realloc(entry_table, ....)
	to avoid horrible bugs.

	Also, make sure the tables get initialized before looking up
	an entry label.

runtime/mercury_imp.h:
	Include mercury_debug.h before most of the modules.
	(mercury_engine.h adds a new MemoryZone only if we are
	debugging accurate GC).

runtime/mercury_memory.c:
	Setup the debug_memory_zone sizes.
	Remove an unnecessary prototype.

runtime/mercury_memory_handlers.c:
	Add code to get the program counter and the stack pointer
	from the signal context.

	Call MR_schedule_agc() from default_handler() if doing accurate gc.

runtime/mercury_memory_zones.c:
	Setup the hardzone regardless of whether redzones are used.

	Add some more debugging information.

runtime/mercury_regorder.h:
runtime/machdeps/alpha_regs.h:
runtime/machdeps/i386_regs.h:
	Add definitions to make the real machine registers name/number
	for MR_sp available.

runtime/mercury_trace_internal.c:
runtime/mercury_trace_util.c:
runtime/mercury_trace_util.h:
	Add MR_trace_write_variable(), which writes terms given their
	value and type_info.

runtime/mercury_wrapper.c:
runtime/mercury_wrapper.h:
	Change the size of the heap redzone when doing accurate GC.
	Use a small heap when debugging agc.

runtime/mercury_debug.h:
runtime/mercury_conf_param.h:
	Add new debugging macros and document them.

runtime/mercury_type_info.c:
	Add const to the pointer arguments of MR_make_type_info.
1998-07-22 07:55:19 +00:00
..

This directory contains architecture-dependent code
for using gcc global register variables.

Each header file in this directory should implement the same
interface; this interface is documented in the file `no_regs.h'
(which is the portable version that gets used for unknown
architectures, or if you're not using gcc).

To add a definition for a new architecture, you need to

	- Find the config header file in the gcc source code which
	  defines how registers are used for that machine
	  (e.g. for mips, the file is .../config/mips/mips.h).
	  Find the definitions of FIXED_REGISTERS and
	  CALL_USED_REGISTERS in that header file.
	  These are arrays of booleans indexed by register
	  number; somewhere in the same file there should also be
	  some indication of gcc's register numbering scheme,
	  so that you can figure out the corresponding register names.

	- Choose which registers for Mercury to use as global register
	  variables.  Registers that are fixed or call_used cannot be used.
	  (That's why you need to look at the FIXED_REGISTERS and
	  CALL_USED_REGISTERS macros in the gcc source code.)
	  It's a good idea to leave some registers for use by gcc
	  (but that may not always be possible, e.g. see the comment
	  at the start of alpha_regs.h).
	  Other than that, it's up to you.

	- Add a new header file for your architecure in this directory.
	  This header file should define the same set of macros as the
	  other header files here.  The documentation for what they
	  should do is in `no_regs.h'.

	- Add a new case to the switch on machine type in `../regs.h';
	  this new case should #include the header file you just added.