[m-rev.] for review: make agc debugging a run-time option
Fergus Henderson
fjh at cs.mu.OZ.AU
Sat Jun 8 01:33:12 AEST 2002
Make the accurate GC debugging code a run-time option rather than a
compile-time option.
The run-time cost of this is very small -- just a few `if' statements
per garbage collection -- and it is more convenient if agc debugging
can be enabled by setting MERCURY_OPTIONS rather than by having to
recompile the Mercury runtime.
runtime/mercury_engine.h:
Add a new debug flag `MR_agc_debug', for debugging accurate GC.
runtime/mercury_wrapper.c:
Set the flag if the -dA or -dG options are
specified in MERCURY_OPTIONS.
runtime/mercury_accurate_gc.c:
Change the code which was using `#ifdef MR_AGC_DEBUG_COLLECTION'
to instead use `if (MR_agc_debug)'.
runtime/mercury_conf_param.h:
Delete the documentation of the now unused configuration macro
MR_AGC_DEBUG_COLLECTION, and add a mention of the -dG option.
Workspace: /home/ceres/fjh/mercury
Index: runtime/mercury_accurate_gc.c
===================================================================
RCS file: /home/mercury1/repository/mercury/runtime/mercury_accurate_gc.c,v
retrieving revision 1.21
diff -u -d -r1.21 mercury_accurate_gc.c
--- runtime/mercury_accurate_gc.c 7 Jun 2002 00:48:59 -0000 1.21
+++ runtime/mercury_accurate_gc.c 7 Jun 2002 15:05:40 -0000
@@ -84,16 +84,19 @@
old_heap = MR_ENGINE(MR_eng_heap_zone);
new_heap = MR_ENGINE(MR_eng_heap_zone2);
-#ifdef MR_DEBUG_AGC_COLLECTION
- fprintf(stderr, "\ngarbage_collect() called.\n");
+ /*
+ ** Print some debugging messages.
+ */
+ if (MR_agc_debug) {
+ fprintf(stderr, "\ngarbage_collect() called.\n");
- fprintf(stderr, "old_heap->min: %lx \t old_heap->hardmax: %lx\n",
- (long) old_heap->min, (long) old_heap->hardmax);
+ fprintf(stderr, "old_heap->min: %lx \t old_heap->hardmax: %lx\n",
+ (long) old_heap->min, (long) old_heap->hardmax);
fprintf(stderr, "new_heap->min: %lx \t new_heap->hardmax: %lx\n",
- (long) new_heap->min, (long) new_heap->hardmax);
+ (long) new_heap->min, (long) new_heap->hardmax);
- fprintf(stderr, "MR_virtual_hp: %lx\n", (long) MR_virtual_hp);
-#endif
+ fprintf(stderr, "MR_virtual_hp: %lx\n", (long) MR_virtual_hp);
+ }
old_hp = MR_virtual_hp;
@@ -128,10 +131,10 @@
MR_ENGINE(MR_eng_heap_zone) = tmp;
}
-#ifdef MR_DEBUG_AGC_COLLECTION
- fprintf(stderr, "Swapped heaps\n");
- fprintf(stderr, "MR_virtual_hp: %lx\n", (long) MR_virtual_hp);
-#endif
+ if (MR_agc_debug) {
+ fprintf(stderr, "Swapped heaps\n");
+ fprintf(stderr, "MR_virtual_hp: %lx\n", (long) MR_virtual_hp);
+ }
/*
** Copy any roots on the stack
@@ -143,41 +146,42 @@
*/
garbage_collect_roots();
-#ifdef MR_DEBUG_AGC_COLLECTION
- fprintf(stderr, "Clearing old heap:\n");
+ /*
+ ** Print some more debugging messages,
+ ** and clear out the old heap.
+ */
+ if (MR_agc_debug) {
+ fprintf(stderr, "Clearing old heap:\n");
- {
- MR_Word *tmp_hp;
+ {
+ MR_Word *tmp_hp;
- for (tmp_hp = old_heap->min; tmp_hp <= old_hp; tmp_hp++) {
+ for (tmp_hp = old_heap->min; tmp_hp <= old_hp; tmp_hp++) {
*tmp_hp = 0xDEADBEAF;
- }
- }
+ }
+ }
- fprintf(stderr, "AFTER:\n");
+ fprintf(stderr, "AFTER:\n");
/* XXX save this, it appears to get clobbered */
- new_hp = MR_virtual_hp;
+ new_hp = MR_virtual_hp;
- MR_agc_dump_roots(root_list);
+ MR_agc_dump_roots(root_list);
/* XXX restore this, it appears to get clobbered */
- fprintf(stderr, "MR_virtual_hp: %lx\n", (long) MR_virtual_hp);
- MR_virtual_hp = new_hp;
- fprintf(stderr, "MR_virtual_hp: %lx\n", (long) MR_virtual_hp);
-
- fprintf(stderr, "old heap: %ld bytes, new heap: %ld bytes\n",
- (long) ((char *) old_hp - (char *) old_heap->min),
- (long) ((char *) MR_virtual_hp - (char *) new_heap->min));
- fprintf(stderr, "%ld bytes recovered\n",
- (long) ((char *) old_hp - (char *) old_heap->min) -
- ((char *) MR_virtual_hp - (char *) new_heap->min));
+ fprintf(stderr, "MR_virtual_hp: %lx\n", (long) MR_virtual_hp);
+ MR_virtual_hp = new_hp;
+ fprintf(stderr, "MR_virtual_hp: %lx\n", (long) MR_virtual_hp);
-#endif
+ fprintf(stderr, "old heap: %ld bytes, new heap: %ld bytes\n",
+ (long) ((char *) old_hp - (char *) old_heap->min),
+ (long) ((char *) MR_virtual_hp - (char *) new_heap->min));
+ fprintf(stderr, "%ld bytes recovered\n",
+ (long) ((char *) old_hp - (char *) old_heap->min) -
+ ((char *) MR_virtual_hp - (char *) new_heap->min));
-#ifdef MR_DEBUG_AGC_COLLECTION
- fprintf(stderr, "garbage_collect() done.\n\n");
-#endif
+ fprintf(stderr, "garbage_collect() done.\n\n");
+ }
}
static void
@@ -403,16 +407,16 @@
old_heap = MR_ENGINE(MR_eng_heap_zone);
new_heap = MR_ENGINE(MR_eng_heap_zone2);
-#ifdef MR_DEBUG_AGC_COLLECTION
- fprintf(stderr, "\ngarbage_collect() called.\n");
+ if (MR_agc_debug) {
+ fprintf(stderr, "\ngarbage_collect() called.\n");
- fprintf(stderr, "old_heap->min: %lx \t old_heap->hardmax: %lx\n",
- (long) old_heap->min, (long) old_heap->hardmax);
+ fprintf(stderr, "old_heap->min: %lx \t old_heap->hardmax: %lx\n",
+ (long) old_heap->min, (long) old_heap->hardmax);
fprintf(stderr, "new_heap->min: %lx \t new_heap->hardmax: %lx\n",
- (long) new_heap->min, (long) new_heap->hardmax);
+ (long) new_heap->min, (long) new_heap->hardmax);
- fprintf(stderr, "MR_virtual_hp: %lx\n", (long) MR_virtual_hp);
-#endif
+ fprintf(stderr, "MR_virtual_hp: %lx\n", (long) MR_virtual_hp);
+ }
old_hp = MR_virtual_hp;
@@ -432,34 +436,34 @@
MR_ENGINE(MR_eng_heap_zone) = tmp;
}
-#ifdef MR_DEBUG_AGC_COLLECTION
- fprintf(stderr, "Swapped heaps\n");
- fprintf(stderr, "MR_virtual_hp: %lx\n", (long) MR_virtual_hp);
-#endif
+ if (MR_agc_debug) {
+ fprintf(stderr, "Swapped heaps\n");
+ fprintf(stderr, "MR_virtual_hp: %lx\n", (long) MR_virtual_hp);
+ }
label = MR_lookup_internal_by_addr(success_ip);
label_layout = label->i_layout;
-#ifdef MR_DEBUG_AGC_COLLECTION
- first_label = label;
- first_stack_pointer = stack_pointer;
- first_current_frame = current_frame;
- first_max_frame = max_frame;
- fprintf(stderr, "BEFORE:\n");
- MR_agc_dump_stack_frames(first_label, old_heap, first_stack_pointer,
- first_current_frame);
- MR_agc_dump_nondet_stack_frames(first_label, old_heap, first_stack_pointer,
- first_current_frame, first_max_frame);
- MR_agc_dump_roots(root_list);
+ if (MR_agc_debug) {
+ first_label = label;
+ first_stack_pointer = stack_pointer;
+ first_current_frame = current_frame;
+ first_max_frame = max_frame;
+ fprintf(stderr, "BEFORE:\n");
+ MR_agc_dump_stack_frames(first_label, old_heap, first_stack_pointer,
+ first_current_frame);
+ MR_agc_dump_nondet_stack_frames(first_label, old_heap,
+ first_stack_pointer, first_current_frame, first_max_frame);
+ MR_agc_dump_roots(root_list);
- /*
- ** XXX the debug code seems to be messing up the heap pointer.
- ** easier to reset it than debug the problem at the moment
- */
- fprintf(stderr, "MR_virtual_hp: %lx\n", (long) MR_virtual_hp);
- MR_virtual_hp = new_heap->min;
- fprintf(stderr, "MR_virtual_hp: %lx\n", (long) MR_virtual_hp);
-#endif
+ /*
+ ** XXX the debug code seems to be messing up the heap pointer.
+ ** easier to reset it than debug the problem at the moment
+ */
+ fprintf(stderr, "MR_virtual_hp: %lx\n", (long) MR_virtual_hp);
+ MR_virtual_hp = new_heap->min;
+ fprintf(stderr, "MR_virtual_hp: %lx\n", (long) MR_virtual_hp);
+ }
/*
** For each stack frame ...
@@ -470,10 +474,10 @@
const MR_Label_Layout *return_label_layout;
int short_var_count, long_var_count;
-#ifdef MR_DEBUG_AGC_COLLECTION
- printlabel((MR_Code *) (Word) label->i_addr);
- fflush(NULL);
-#endif
+ if (MR_agc_debug) {
+ printlabel((MR_Code *) (Word) label->i_addr);
+ fflush(NULL);
+ }
short_var_count = MR_short_desc_var_count(label_layout);
long_var_count = MR_long_desc_var_count(label_layout);
@@ -574,21 +578,21 @@
frame_size = max_frame - MR_prevfr_slot(max_frame);
if (frame_size == MR_NONDET_TEMP_SIZE) {
-#ifdef MR_DEBUG_AGC_COLLECTION
+ if (MR_agc_debug) {
printlabel(MR_redoip_slot(max_frame));
fflush(NULL);
-#endif
+ }
} else if (frame_size == MR_DET_TEMP_SIZE) {
-#ifdef MR_DEBUG_AGC_COLLECTION
+ if (MR_agc_debug) {
printlabel(MR_redoip_slot(max_frame));
fflush(NULL);
-#endif
- stack_pointer = MR_detfr_slot(max_frame); /* XXX ??? */
+ }
+ stack_pointer = MR_detfr_slot(max_frame); /* XXX ??? */
} else {
-#ifdef MR_DEBUG_AGC_COLLECTION
+ if (MR_agc_debug) {
printlabel(MR_redoip_slot(max_frame));
fflush(NULL);
-#endif
+ }
}
label = MR_lookup_internal_by_addr(MR_redoip_slot(max_frame));
@@ -649,48 +653,47 @@
*/
garbage_collect_roots();
-#ifdef MR_DEBUG_AGC_COLLECTION
- fprintf(stderr, "Clearing old heap:\n");
+ if (MR_agc_debug) {
+ fprintf(stderr, "Clearing old heap:\n");
- {
- Word *tmp_hp;
+ {
+ Word *tmp_hp;
- for (tmp_hp = old_heap->min; tmp_hp <= old_hp; tmp_hp++) {
- *tmp_hp = 1;
- }
- }
+ for (tmp_hp = old_heap->min; tmp_hp <= old_hp; tmp_hp++) {
+ *tmp_hp = 0xDEADBEAF;
+ }
+ }
- fprintf(stderr, "AFTER:\n");
+ fprintf(stderr, "AFTER:\n");
/* XXX save this, it appears to get clobbered */
- new_hp = MR_virtual_hp;
+ new_hp = MR_virtual_hp;
- MR_agc_dump_stack_frames(first_label, new_heap, first_stack_pointer,
- first_current_frame);
- MR_agc_dump_roots(root_list);
- MR_agc_dump_nondet_stack_frames(first_label, new_heap, first_stack_pointer,
- first_current_frame, first_max_frame);
+ MR_agc_dump_stack_frames(first_label, new_heap, first_stack_pointer,
+ first_current_frame);
+ MR_agc_dump_roots(root_list);
+ MR_agc_dump_nondet_stack_frames(first_label, new_heap,
+ first_stack_pointer, first_current_frame, first_max_frame);
/* XXX restore this, it appears to get clobbered */
- fprintf(stderr, "MR_virtual_hp: %lx\n", (long) MR_virtual_hp);
- MR_virtual_hp = new_hp;
- fprintf(stderr, "MR_virtual_hp: %lx\n", (long) MR_virtual_hp);
-
- fprintf(stderr, "old heap: %ld bytes, new heap: %ld bytes\n",
- (long) ((char *) old_hp - (char *) old_heap->min),
- (long) ((char *) MR_virtual_hp - (char *) new_heap->min));
- fprintf(stderr, "%ld bytes recovered\n",
- (long) ((char *) old_hp - (char *) old_heap->min) -
- ((char *) MR_virtual_hp - (char *) new_heap->min));
+ fprintf(stderr, "MR_virtual_hp: %lx\n", (long) MR_virtual_hp);
+ MR_virtual_hp = new_hp;
+ fprintf(stderr, "MR_virtual_hp: %lx\n", (long) MR_virtual_hp);
-#endif
+ fprintf(stderr, "old heap: %ld bytes, new heap: %ld bytes\n",
+ (long) ((char *) old_hp - (char *) old_heap->min),
+ (long) ((char *) MR_virtual_hp - (char *) new_heap->min));
+ fprintf(stderr, "%ld bytes recovered\n",
+ (long) ((char *) old_hp - (char *) old_heap->min) -
+ ((char *) MR_virtual_hp - (char *) new_heap->min));
+ }
/* Reset the redzone on the old heap */
MR_reset_redzone(old_heap);
-#ifdef MR_DEBUG_AGC_COLLECTION
- fprintf(stderr, "garbage_collect() done.\n\n");
-#endif
+ if (MR_agc_debug) {
+ fprintf(stderr, "garbage_collect() done.\n\n");
+ }
}
Index: runtime/mercury_conf_param.h
===================================================================
RCS file: /home/mercury1/repository/mercury/runtime/mercury_conf_param.h,v
retrieving revision 1.59
diff -u -d -r1.59 mercury_conf_param.h
--- runtime/mercury_conf_param.h 16 May 2002 13:14:52 -0000 1.59
+++ runtime/mercury_conf_param.h 7 Jun 2002 14:58:43 -0000
@@ -166,11 +166,7 @@
**
** MR_DEBUG_AGC_SCHEDULING
** Display debugging information while scheduling accurate garbage
-** collection.
-**
-** MR_DEBUG_AGC_COLLECTION
-** Display debugging information while collecting garbage using the
-** accurate garbage collector.
+** collection (for the low-level back-end).
**
** MR_DEBUG_AGC_FORWARDING
** Display debugging information when leaving or finding forwarding
@@ -185,11 +181,16 @@
** collection.
**
** MR_DEBUG_AGC_SMALL_HEAP
-** Use a small heap to trigger garbage collection more often.
+** Use a small heap (52k) to trigger garbage collection more often.
+** This is the same as setting MERCURY_OPTIONS="--heap-size 52".
**
** MR_DEBUG_AGC_ALL
** Turn on all debugging information for accurate garbage
** collection. (Equivalent to all MR_DEBUG_AGC_* macros above).
+**
+** Note that general debugging information about accurate
+** garbage collection is printed if -dG is included in MERCURY_OPTIONS.
+** This works even if none of the MR_DEBUG_AGC_* macros are enabled.
**
** MR_TABLE_DEBUG
** Enables low-level debugging messages from the tabling system.
Index: runtime/mercury_engine.h
===================================================================
RCS file: /home/mercury1/repository/mercury/runtime/mercury_engine.h,v
retrieving revision 1.24
diff -u -d -r1.24 mercury_engine.h
--- runtime/mercury_engine.h 18 Feb 2002 07:01:15 -0000 1.24
+++ runtime/mercury_engine.h 7 Jun 2002 15:14:27 -0000
@@ -50,8 +50,9 @@
#define MR_TABLEHASHFLAG 11
#define MR_TABLESTACKFLAG 12
#define MR_UNBUFFLAG 13
-#define MR_DETAILFLAG 14
-#define MR_MAXFLAG 15
+#define MR_AGC_FLAG 14
+#define MR_DETAILFLAG 15
+#define MR_MAXFLAG 16
/* MR_DETAILFLAG should be the last real flag */
#define MR_progdebug MR_debugflag[MR_PROGFLAG]
@@ -69,6 +70,7 @@
#define MR_tablestackdebug MR_debugflag[MR_TABLESTACKFLAG]
#define MR_unbufdebug MR_debugflag[MR_UNBUFFLAG]
#define MR_detaildebug MR_debugflag[MR_DETAILFLAG]
+#define MR_agc_debug MR_debugflag[MR_AGC_FLAG]
/*
** MR_setjmp and MR_longjmp are wrappers around setjmp and longjmp
Index: runtime/mercury_wrapper.c
===================================================================
RCS file: /home/mercury1/repository/mercury/runtime/mercury_wrapper.c,v
retrieving revision 1.105
diff -u -d -r1.105 mercury_wrapper.c
--- runtime/mercury_wrapper.c 6 Mar 2002 14:35:00 -0000 1.105
+++ runtime/mercury_wrapper.c 7 Jun 2002 14:24:10 -0000
@@ -947,6 +947,9 @@
#ifdef MR_CONSERVATIVE_GC
GC_quiet = MR_FALSE;
#endif
+#ifdef MR_NATIVE_GC
+ MR_agc_debug = MR_TRUE;
+#endif
} else if (MR_streq(MR_optarg, "b")) {
MR_nondstackdebug = MR_TRUE;
} else if (MR_streq(MR_optarg, "c")) {
@@ -960,6 +963,8 @@
} else if (MR_streq(MR_optarg, "G")) {
#ifdef MR_CONSERVATIVE_GC
GC_quiet = MR_FALSE;
+#elif defined(MR_NATIVE_GC)
+ MR_agc_debug = MR_TRUE;
#else
; /* ignore inapplicable option */
#endif
--
Fergus Henderson <fjh at cs.mu.oz.au> | "I have always known that the pursuit
The University of Melbourne | of excellence is a lethal habit"
WWW: <http://www.cs.mu.oz.au/~fjh> | -- the last words of T. S. Garp.
--------------------------------------------------------------------------
mercury-reviews mailing list
post: mercury-reviews at cs.mu.oz.au
administrative address: owner-mercury-reviews at cs.mu.oz.au
unsubscribe: Address: mercury-reviews-request at cs.mu.oz.au Message: unsubscribe
subscribe: Address: mercury-reviews-request at cs.mu.oz.au Message: subscribe
--------------------------------------------------------------------------
More information about the reviews
mailing list