package goo
found 325346 0.155-2
tag 325346 + upstream confirmed help
retitle 325346 goo: 64-bit binaries segfault on startup
thanks

I'm aware that goo has outstanding 64-bit cleanliness issues, and even
have a 64-bit machine on which I can investigate them.  Unfortunately,
though, I have limited free time for Debian work, and they aren't as
easy to fix as I'd hoped -- even with the attached patch, which
address all the suspicious-looking warnings I noticed (as well as some
others that were merely adding a lot of noise to the logs), I still
get segfaults on startup.

I will try to find time to investigate more fully, but can't guarantee
that I'll get a chance any time soon, so I'm tagging this bug "help"
in hopes that someone with more time will take pity on me. ;-)

Anyway, here's the patch, which I didn't bother folding into my
released packages because it proved insufficient.

Index: c/g2c/goo/%system.c
===================================================================
--- c/g2c/goo/%system.c	(revision 31)
+++ c/g2c/goo/%system.c	(working copy)
@@ -6,8 +6,10 @@
 
 #include <sys/stat.h>
 #if !defined(_MSC_VER)
+#include <sys/wait.h>
 #include <unistd.h>
 #endif
+#include <ctype.h>
 #include <errno.h>
 
 extern P Yfab_sym;
Index: c/g2c/time/%threads.c
===================================================================
--- c/g2c/time/%threads.c	(revision 31)
+++ c/g2c/time/%threads.c	(working copy)
@@ -38,7 +38,7 @@
 }
 
 P YtimeSthreadsYPthread_join (P thread) {
-  return (P)GC_pthread_join(thread);
+  return (P)GC_pthread_join((pthread_t)thread, NULL);
 }
 
 P YtimeSthreadsYPthread_priority (P thread) {
Index: c/grt.c
===================================================================
--- c/grt.c	(revision 31)
+++ c/grt.c	(working copy)
@@ -244,7 +244,7 @@
 
 unsigned long env_nallocd = 0;
 
-INLINE P ENVFAB (int n) {
+INLINE P ENVFAB (PINT n) {
   unsigned long snallocd = nallocd;
   ENV env = allocate(sizeof(ENV_DATA) + ((n - 1) * sizeof(P)));
   env_nallocd += nallocd - snallocd;
@@ -252,7 +252,7 @@
   return env;
 }
 
-P YPvm_fun_env_fab (P n) { return ENVFAB((int)n); }
+P YPvm_fun_env_fab (P n) { return ENVFAB((PINT)n); }
 
 P FABENV (int size, ...) {
   int i;
@@ -538,11 +538,11 @@
   } 
   switch (t) {
   case int_tag:
-    printf("%d", untag(adr)); return;
+    printf("%ld", untag(adr)); return;
   case chr_tag:
-    printf("%c", untag(adr)); return;
+    printf("%c", (char)untag(adr)); return;
   case loc_tag:
-    printf("&0x%lx", tag((P)untag(adr), 0)); return;
+    printf("&%#lx", tag((P)untag(adr), 0)); return;
   default:
     break;
   }
@@ -640,16 +640,16 @@
       printf("]");
     }
     */
-    printf(" 0x%lx)", adr);
+    printf(" %p)", adr);
   } else if (strcmp(typename, "<gen>") == 0) {
     printf("(GEN ");
     print_kind((P)YPmet_name(adr), 0, depth+1);
     print_kind(FUNSPECS(adr), 0, depth + 1);
-    printf(" 0x%lx)", adr);
+    printf(" %p)", adr);
   } else if (strcmp(typename, "<file-out-port>") == 0) {
-    printf("(OUT-PORT 0x%lx)", adr);
+    printf("(OUT-PORT %p)", adr);
   } else if (strcmp(typename, "<file-in-port>") == 0) {
-    printf("(IN-PORT 0x%lx)", adr);
+    printf("(IN-PORT %p)", adr);
   } else {
     int i;
     P c       = YPobject_class(adr);
@@ -664,7 +664,7 @@
 	printf("..."); break;
       }
     }
-    printf(" 0x%lx)", adr);
+    printf(" %p)", adr);
   }} else {
     printf("<>");
   }
@@ -679,7 +679,7 @@
     printf("NUL");
   else {
     char* typename = type(adr);
-    printf("0x%lx", adr);
+    printf("%p", adr);
     if (typename) 
       printf(" ISA %s", typename);
   }
@@ -717,7 +717,7 @@
       if (metp) {
 	int j;
 	ENV env = (ENV)YPprop_elt(adr, (P)FUNENVOFFSET);
-	printf("ENV SIZE %d\n", env->size);
+	printf("ENV SIZE %ld\n", env->size);
 	for (j = 0; j < env->size; j++, i++)
 	  desprop(i, ENVGET(env, j));
       }
@@ -814,7 +814,7 @@
 }
 
 P YevalSg2cYPprint_cpu_usage(char *message) {
-	return;
+	return Ynil;
 /*
   struct rusage usage;
   getrusage(RUSAGE_SELF, &usage);
@@ -989,14 +989,14 @@
 #endif
 
 #define MAX_DYNVARS 256
-int dynvar_key = 0; 
+PINT dynvar_key = 0; 
 
 // NO LOCK NEEDED BECAUSE DDV OCCURS ON ONE THREAD ONLY
 // TODO: PROPAGATE NEW VAR VALS TO EXISTING THREADS
 // TODO: EXTEND WHEN OVERFLOW
 
 P DYNFAB(P v) {
-  int* key = (int*)v; 
+  T* key = (T*)v; 
   *key = dynvar_key++;
   if (dynvar_key > MAX_DYNVARS)
     XXCALL1(1, Yerror, YPsb("TOO MANY DYNAMIC VARIABLES."));
Index: c/grt.h
===================================================================
--- c/grt.h	(revision 31)
+++ c/grt.h	(working copy)
@@ -4,6 +4,7 @@
 #define IN_GRT
 #if !defined(_MSC_VER)
 #include "config.h"
+#include <unistd.h>
 #else
 #undef PINT
 #define NOGDI
@@ -16,13 +17,18 @@
 #include <time.h>
 #include <stdarg.h>
 #include <stdio.h>
+#include <stdlib.h>
 #include <string.h>
 #include <setjmp.h>
 #include <math.h>
+#if 0 /* This is unnecessary, and can actually backfire inasmuch as
+	 gc_pthread_redirects.h is an internal header that expects
+	 gc_config_macros.h to have been included. */
 #ifdef HAVE_POSIX_THREAD
 #include <pthread.h>
 #include <gc/gc_pthread_redirects.h>
 #endif
+#endif
 
 #if defined(_MSC_VER)
 #define INLINE
@@ -46,6 +52,12 @@
 #define IMPORTEXPORT
 #endif
 
+#ifdef __GNUC__
+#define POSSIBLY_UNUSED __attribute((unused))
+#else
+#define POSSIBLY_UNUSED
+#endif
+
 /* LOW LEVEL */
 
 typedef FILE*          PPORT;
@@ -369,7 +381,13 @@
 #define YPset_regs(x) (regs = (REGS)(x))
 
 #define REG(x)       (regs->x)
-#define CREG(x)      (REGSCREF()->x)
+STATIC_NOT_GRT_C INLINE REGS CREG_helper(REGS* pregs) {
+  if (!*pregs) {
+    *pregs = REGSREF();
+  }
+  return *pregs;
+}
+#define CREG(x)      (CREG_helper(&regs)->x)
 #define REGSET(x, v) (regs->x = (v))
 
 #define MAX_STACK_SIZE         70000
@@ -468,7 +486,7 @@
 */
 
 #define FUNREG()          *(REG(sp)-1)
-#define LINK_STACK()      P Pfun = FUNREG(); P Pnext_methods = REG(next_methods); *REG(sp) = REG(fp); REGSET(fp, REG(sp)); REGSET(sp, REG(sp)+1); 
+#define LINK_STACK()      P Pfun POSSIBLY_UNUSED = FUNREG(); P Pnext_methods POSSIBLY_UNUSED = REG(next_methods); *REG(sp) = REG(fp); REGSET(fp, REG(sp)); REGSET(sp, REG(sp)+1); 
 #define UNLINK_STACK()    {REGSET(sp, REG(fp));  REGSET(fp, *REG(sp)); }
 #define YPunlink_stack() (0);UNLINK_STACK()
 #define ARGLEN()          (REG(fp)[-2])
@@ -907,4 +925,142 @@
 
 IMPORTEXPORT extern P YPlit (P n);
 
+/* Various other functions that had sometimes been used without being
+   declared; since these generally return P, prototypes are crucial
+   when sizeof(P) != sizeof(int). */
+
+/* From boot.c: */
+extern P YOadd (P,P);
+extern P YOadd_new (P,P);
+extern P YOlen (P);
+extern P YOpair (P,P);
+extern P YOsingleton_isaQ (P,P);
+extern P YOtail_setter (P,P);
+extern P YPallocate_stack (P);
+extern P YPclass (P,P,P,P,P,P,P,P,P,P,P,P);
+extern P YPclass_ancestors_setter (P,P);
+extern P YPclass_children_setter (P,P);
+extern P YPclass_direct_props_setter (P,P);
+extern P YPclass_forward_setter (P,P);
+extern P YPclass_gens_setter (P,P);
+extern P YPclass_id_setter (P,P);
+extern P YPclass_mets_setter (P,P);
+extern P YPclass_prop_len_setter (P,P);
+extern P YPclass_props_setter (P,P);
+extern P YPclass_row_setter (P,P);
+extern P YPdo_stack_frames (P fun);
+extern P YPfb (P);
+extern P YPfu (P);
+extern P YPfun_cache_setter (P,P);
+extern P YPgen_cache (P,P,P,P,P);
+extern P YPgen_cache_arg_pos_setter (P,P);
+extern P YPgen_cache_classes_setter (P,P);
+extern P YPgen_cache_singletons_setter (P,P);
+extern P YPgen_code_setter (P,P);
+extern P YPgen_mets_setter (P,P);
+extern P YPhead_setter (P,P);
+extern P YPiu (P);
+extern P YPmet_env_setter (P,P);
+extern P YPopts_tup (P,P,P);
+extern P YPpatch_early_generics ();
+extern P YPrep (P,P);
+extern P YPsingleton (P);
+extern P YPstr (P,P);
+extern P YPtag (P,P);
+extern P YPtag_into (P,P);
+extern P YPtail_setter (P,P);
+extern P YPtup (P,P);
+extern P YPuntag (P);
+extern P YPuntag_into (P);
+
+/* From grt.c: */
+extern P YPunexec(P name);
+extern P YevalSg2cYPprint_cpu_usage(char *message);
+extern P allocate (unsigned long size);
+extern P allocate_atomic (unsigned long size);
+
+/* From g2c/goo/%math.c: */
+extern P FLOINT (PFLO x);
+extern P YgooSmathYPfA(P x, P y);
+extern P YgooSmathYPfE(P x, P y);
+extern P YgooSmathYPfL(P x, P y);
+extern P YgooSmathYPfS(P x, P y);
+extern P YgooSmathYPfT(P x, P y);
+extern P YgooSmathYPf_(P x, P y);
+extern P YgooSmathYPfacos(P x);
+extern P YgooSmathYPfasin(P x);
+extern P YgooSmathYPfatan(P x);
+extern P YgooSmathYPfatan2(P y, P x);
+extern P YgooSmathYPfcos(P x);
+extern P YgooSmathYPfcosh(P x);
+extern P YgooSmathYPfi2f(P x);
+extern P YgooSmathYPflo_bits (P x);
+extern P YgooSmathYPflog(P x);
+extern P YgooSmathYPfpow(P x, P n);
+extern P YgooSmathYPfsin(P x);
+extern P YgooSmathYPfsinh(P x);
+extern P YgooSmathYPfsqrt(P x);
+extern P YgooSmathYPft(P x);
+extern P YgooSmathYPftan(P x);
+extern P YgooSmathYPftanh(P x);
+
+/* From g2c/goo/%system.c: */
+extern P YgooSsystemYPcompile (P cfile, P sofile, P incs, P libs);
+extern P YgooSsystemYPcreate_directory (P name);
+extern P YgooSsystemYPfile_existsQ (P name);
+extern P YgooSsystemYPfile_mtime (P name);
+extern P YgooSsystemYPfile_type (P name);
+extern P YgooSsystemYPload(P name);
+extern P YgooSsystemYPos_name ();
+extern P YgooSsystemYPos_val (P name);
+extern P YgooSsystemYPos_val_setter (P value, P name);
+extern P YgooSsystemYPtime ();
+
+/* From g2c/goo/fun.c: */
+extern P YgooSfunYprop_bound_atQ (P,P);
+extern P YgooSfunYprop_value_at (P,P);
+extern P YgooSfunYprop_value_at_setter (P,P,P);
+
+/* From g2c/goo/io/%port.c: */
+extern P YgooSioSportYPclose_in_port (P s);
+extern P YgooSioSportYPclose_out_port (P s);
+extern PPORT YgooSioSportYPcurrent_in_port (void);
+extern PPORT YgooSioSportYPcurrent_out_port (void);
+extern P YgooSioSportYPforce_out (P s);
+extern P YgooSioSportYPget (P s);
+extern P YgooSioSportYPnewline (P s);
+extern P YgooSioSportYPopen_in_file (P name);
+extern P YgooSioSportYPopen_out_file (P name);
+extern P YgooSioSportYPpeek (P s);
+extern P YgooSioSportYPput (P s, P x);
+extern P YgooSioSportYPputs (P s, P x);
+extern P YgooSioSportYPreadyQ (P s);
+
+/* From g2c/time/%event.c: */
+extern P YtimeSeventYPevent_broadcast (P handle);
+extern P YtimeSeventYPevent_create (P name);
+extern P YtimeSeventYPevent_reset (P handle);
+extern P YtimeSeventYPevent_signal (P handle);
+extern P YtimeSeventYPevent_wait (P event, P lock);
+extern P YtimeSeventYPevent_wait_timed (P event, P lock, P timeout);
+
+/* From g2c/time/%lock.c: */
+extern P YtimeSlockYPlock_create (P name);
+extern P YtimeSlockYPlock_destroy (P handle);
+extern P YtimeSlockYPlock_lock (P handle);
+extern P YtimeSlockYPlock_try_lock (P handle);
+extern P YtimeSlockYPlock_unlock (P handle);
+
+/* From g2c/time/%threads.c: */
+extern P YtimeSthreadsYPthread_create (P function);
+extern P YtimeSthreadsYPthread_current ();
+extern P YtimeSthreadsYPthread_detach ();
+extern P YtimeSthreadsYPthread_goo_thread ();
+extern P YtimeSthreadsYPthread_goo_thread_setter (P value);
+extern P YtimeSthreadsYPthread_join (P thread);
+extern P YtimeSthreadsYPthread_priority (P thread);
+extern P YtimeSthreadsYPthread_priority_setter (P x, P thread);
+extern P YtimeSthreadsYPthread_sleep (P secs);
+extern P YtimeSthreadsYPthread_yield ();
+
 #endif
Index: debian/rules
===================================================================
--- debian/rules	(revision 31)
+++ debian/rules	(working copy)
@@ -3,6 +3,8 @@
 include /usr/share/cdbs/1/class/autotools.mk
 include /usr/share/cdbs/1/rules/debhelper.mk
 
+CFLAGS += -D_GNU_SOURCE
+
 ifeq ($(shell dpkg-architecture -qDEB_BUILD_ARCH),hppa)
     CFLAGS += -ffunction-sections
 endif
@@ -13,6 +15,8 @@
     DEB_CONFIGURE_EXTRA_FLAGS = --without-threads
 else
     DEB_CONFIGURE_EXTRA_FLAGS = --with-threads
+    # Configure probably ought to define these, but doesn't. :-/
+    CFLAGS += -D_REENTRANT -DGC_THREADS
 endif
 
 DEB_INSTALL_CHANGELOGS_ALL = txt/changes.txt
-- 
Aaron M. Ucko, KB1CJC (amu at alum.mit.edu, ucko at debian.org)
Finger [EMAIL PROTECTED] (NOT a valid e-mail address) for more info.

Reply via email to