diff -ruN klic-3.003-2002-03-05b/include/klic/g_basic.h klic-3.003-2002-03-05c/include/klic/g_basic.h
--- klic-3.003-2002-03-05b/include/klic/g_basic.h	Tue Mar  5 15:10:35 2002
+++ klic-3.003-2002-03-05c/include/klic/g_basic.h	Tue Mar  5 15:48:06 2002
@@ -102,7 +102,7 @@
 #define G_SIZE_IN_Q(type) ((sizeof(type)+sizeof(q)-1) / sizeof(q))
 
 /* runtime/gc.c */
-extern q** make_larger_stack(q** sp);
+extern void make_larger_stack(void);
 
 
 /** G_COPY_KL1_TERM_TO_NEWGEN: procedure
@@ -112,7 +112,7 @@
 #define G_COPY_KL1_TERM_TO_NEWGEN(from,to) \
 do{ \
   if (gcsp() == gcmax()) { \
-    set_gcsp(make_larger_stack(gcsp())); \
+    make_larger_stack(); \
   } \
   if(isref(from)) { \
     q *newword = g_allocp++; \
diff -ruN klic-3.003-2002-03-05b/runtime/gc.c klic-3.003-2002-03-05c/runtime/gc.c
--- klic-3.003-2002-03-05b/runtime/gc.c	Tue Mar  5 15:07:00 2002
+++ klic-3.003-2002-03-05c/runtime/gc.c	Tue Mar  5 15:54:43 2002
@@ -54,18 +54,16 @@
   set_old_space_size(temps);
 }
 
-extern q**
-make_larger_stack(sp)
-  q** sp;
+extern void
+make_larger_stack(void)
 {
   declare_globals;
   q** newstack;
   gcstack_size *= 2;
   newstack = (q**) realloc_check((void*) gcstack, gcstack_size*sizeof(q*));
-  sp = newstack + (sp - gcstack);
+  set_gcsp(newstack + (gcsp() - gcstack));
   gcstack = newstack;
   gcmax0 = newstack + gcstack_size;
-  return sp;
 }
 
 #ifdef SHM
@@ -102,16 +100,16 @@
   return (unsigned long)x - (unsigned long)old_space_top() < old_space_size();
 }
 
-#define push_gc_stack(addr, sp)			\
-do{							\
-  if( (sp) == gcmax() ){					\
-    (sp) = make_larger_stack(sp);			\
-  }							\
-  *(sp)++ = (addr);					\
-}while(0)
+static void push_gc_stack(q* addr)
+{
+  if(gcsp() == gcmax())
+    make_larger_stack();
+  *gcsp() = addr;
+  set_gcsp(gcsp() + 1);
+}
 
 #ifdef SHM
-#define reserve_copy(from, to, sp) \
+#define reserve_copy(from, to) \
 if( from == makeref(&from) ){ \
   to = from = makeref(&to); \
 }else{ \
@@ -121,24 +119,24 @@
       push_shm_stack(&to); \
     }else if( within_old_space(from) ){ \
       from = makeref(&to); \
-      push_gc_stack(&to, sp); \
+      push_gc_stack(&to); \
     } \
   } \
 }
 #else /* not SHM */
-#define reserve_copy(from, to, sp)	\
+#define reserve_copy(from, to) \
 if( from == makeref(&from) ){ \
   to = from = makeref(&to); \
 }else{ \
   to = from; \
   if( !isatomic(from) && within_old_space(from) ){ \
     from = makeref(&to); \
-    push_gc_stack(&to, sp); \
+    push_gc_stack(&to); \
   } \
 }
 #endif /* not SHM */
 
-#define copy_one_goal(goal, sp, susp)		\
+#define copy_one_goal(goal, susp)		\
 do{							\
   struct goalrec* og = (goal);				\
   int n = og->pred->arity;				\
@@ -149,7 +147,7 @@
   ng->pred = og->pred;					\
   og->pred = 0;						\
   while( --n >= 0 ){					\
-    reserve_copy(og->args[n], ng->args[n], (sp)); \
+    reserve_copy(og->args[n], ng->args[n]); \
   }							\
   (goal) = ng;						\
   if( susp ) copied_susp++;				\
@@ -160,13 +158,12 @@
 {
   declare_globals;
   q* hp = heapp();
-  q** sp = gcsp();
-  while( sp > gcstack ){
+  while( gcsp() > gcstack ){
     q* addr;
     q obj;
 
-    sp--;
-    addr = *sp;
+    set_gcsp(gcsp() - 1);
+    addr = *gcsp();
     obj = *addr;
 
   loop:
@@ -187,16 +184,16 @@
 
     case CONS:
     cons_case:
-      if( !within_old_space(obj) ){
+      if( !within_old_space((q*) obj) ){
 	*addr = obj;
       }else{
 	q cdr = cdr_of(obj);
-	if( isstruct(cdr) && within_new_space(cdr) ){
+	if( isstruct(cdr) && within_new_space((q*) cdr) ){
 	  *addr = cdr;
 	}else{
 	  q newcons = makecons(hp);
 	  hp += 2;
-	  reserve_copy(car_of(obj), car_of(newcons), sp);
+	  reserve_copy(car_of(obj), car_of(newcons));
 	  *addr = cdr_of(obj) = newcons;
 	  if( isatomic(cdr) ){
 	    cdr_of(newcons) = cdr;
@@ -213,7 +210,7 @@
 
     case FUNCTOR:
     functor_case:
-      if( !within_old_space(obj) ){
+      if( !within_old_space((q*) obj) ){
 	*addr = obj;
       }else{
 	q f = functor_of(obj);
@@ -222,9 +219,7 @@
 	}else if( isref(f) ){
 	  struct data_object* oldobj = (struct data_object*) functorp(obj);
 	  q* newobj;
-	  set_gcsp(sp);
 	  newobj = generic_gc(oldobj, hp);
-	  sp = gcsp();
 	  hp = heapp();
 	  *addr = functor_of(obj) = makefunctor(newobj);
 	}else{
@@ -235,7 +230,7 @@
 	  functor_of(newfunct) = f;
 	  do{
 	    k--;
-	    reserve_copy(arg(obj,k), arg(newfunct,k), sp);
+	    reserve_copy(arg(obj,k), arg(newfunct,k));
 	  }while( k > 0 );
 	}
       }
@@ -254,7 +249,7 @@
 	  obj = value;
 	  goto functor_case;
 	case CONS:
-	  if( !within_new_space(value) ){
+	  if( !within_new_space((q*) value) ){
 	    obj = value;
 	    goto cons_case;
 	  }
@@ -262,7 +257,7 @@
 	  break;
 	case VARREF:
 	  if( derefone(value) != obj ){
-	    if( within_old_space(value) ){
+	    if( within_old_space((q*) value) ){
 	      obj = value;
 	      goto deref;
 	    }
@@ -299,9 +294,7 @@
 	      }else{
 		/* not yet copied */
 		struct generator_object* newobj;
-		set_gcsp(sp);
 		newobj = (struct generator_object*) generic_gc(oldobj, hp);
-		sp = gcsp();
 		hp = heapp();
 		oldobj->method_table =
 		  (struct generator_object_method_table*) makefunctor(newobj);
@@ -331,7 +324,7 @@
 		    }else{
 		      if(isref(u.g->next)) goto invalid_hook;
 		      nu.g = u.g;
-		      copy_one_goal(nu.g, sp, 1);
+		      copy_one_goal(nu.g, 1);
 		    }
 		  }else{
 		    /* consumer object */
@@ -340,10 +333,8 @@
 		      nu.o = tag_consumer_hook(functorp(newplace));
 		    }else{
 		      struct consumer_object* newobj;
-		      set_gcsp(sp);
 		      newobj = (struct consumer_object*)
 			  generic_gc(untag_consumer_hook(u.o), hp);
-		      sp = gcsp();
 		      hp = heapp();
 		      untag_consumer_hook(u.o)->method_table =
 			(struct consumer_object_method_table*)
@@ -380,7 +371,6 @@
       break;
     }  /* switch ptagof(obj) */
   }  /* while stack rests */
-  set_gcsp(sp);
   set_heapp(hp);
 }
 
@@ -416,7 +406,7 @@
     }
 #endif
     hp = heapp();
-    copy_one_goal(qp, gcsp0, 0);
+    copy_one_goal(qp, 0);
     set_heapp(hp);
     copy_terms();
     qp->next = last;
@@ -520,7 +510,7 @@
       switch( ptagof(sptr->localA) ){
       case CONS:
       case FUNCTOR:  /* generator hook but anybody reqested */
-        push_gc_stack((q*) &sptr->localA, gcsp0);
+        push_gc_stack((q*) &sptr->localA);
 	copy_terms();
         push_shm_stack(&sptr->globalA);
         break;
@@ -534,7 +524,7 @@
 	    q top = (q) &(sptr->localA);
 	    derefone(wk) = top;
 	    derefone(top) = wk;
-	    push_gc_stack(&top, gcsp0);
+	    push_gc_stack(&top);
 
 	    /* patch for debugging of hirata problem */
 	    hirata_bug1 = 1;
@@ -547,7 +537,7 @@
 	    sptr->localA = (q*) tag_local(wk);
 	    derefone(wk) = 0;
 	  }else{ /* generator */
-	    push_gc_stack(&wk, gcsp0);
+	    push_gc_stack(&wk);
 	    copy_terms();
 	    sptr->localA = (q*) tag_local(wk);
 	  }
@@ -561,7 +551,7 @@
 	  }else if( !wqp->pred ){
 	    sptr->localA = (q*) wqp->next;
 	  }else if( isint(wqp->next) ){
-	    copy_one_goal(wqp, gcsp0, 1);
+	    copy_one_goal(wqp, 1);
 	    sptr->localA = (q*) wqp;
 	    copy_terms();
 	    if( isref(sptr->globalA) ){
@@ -644,7 +634,7 @@
 	sgl->goal = sgl->goal->next;
       }else{
 	/* not copied yet */
-	copy_one_goal(sgl->goal, gcsp0, 0);
+	copy_one_goal(sgl->goal, 0);
 	set_heapp(hp);
 	copy_terms();
 	hp = heapp();
@@ -681,7 +671,7 @@
   q* term;
 {
   declare_globals;
-  push_gc_stack(term, gcsp0);
+  push_gc_stack(term);
   copy_terms();
 }
 
@@ -694,7 +684,7 @@
 {
   declare_globals;
 
-  push_gc_stack(term, gcsp0);
+  push_gc_stack(term);
   copy_terms();
   return *term;
 }
diff -ruN klic-3.003-2002-03-05b/runtime/gmvv.c klic-3.003-2002-03-05c/runtime/gmvv.c
--- klic-3.003-2002-03-05b/runtime/gmvv.c	Tue Mar  5 15:05:19 2002
+++ klic-3.003-2002-03-05c/runtime/gmvv.c	Tue Mar  5 15:48:42 2002
@@ -171,7 +171,7 @@
      */
     newself->body = GD_SELF->body;
     if (gcsp() == gcmax()) {
-      set_gcsp(make_larger_stack(gcsp()));
+      make_larger_stack();
     }
     *gcsp() = (q*) &(newself->body);
     set_gcsp(gcsp() + 1);
