This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] [4.5 regression] Fix PR42811: java.lang.ExceptionInInitializerError in ecj1 and associated issues.


[ refs: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42811
        http://gcc.gnu.org/ml/java/2010-02/msg00002.html
        http://gcc.gnu.org/ml/java/2010-02/threads.html#00004 ]

    Hi lists,

  The attached patches resolve PR42811 and the knock-on issues uncovered while
fixing it (see refs).  I've separated them out for ease of review but I've
tested them as a group and would like to ask the java maintainers whether they
need to be applied separately or can all just go in as one.  Thanks are due to
Hans and Bryce for their help in solving this one.

  The main PR is resolved by ensuring that both parts of the whole libgcj are
always loaded, so that all the predefined class data from both sets of .jcr
sections is always present at runtime.

  The uninitialised memory fix is straightforward and was already approved by
Bryce in a separate thread, I quote it here for completeness, and with a
slightly reworded changelog in case it needs to be applied separately from the
fix for the main PR.

  The second copy of the gc code living in the -noncore sublibrary turned out
very fortunately to be completely dead, only present because of
--whole-archive; none of the -noncore code needed to link it at all, so there
was no need to export it from the core sublibrary for the -noncore one to use.
 Of course it was still a waste of time, memory and disk space, and it
confused the hell out of gdb for some reason.  The same turned out to apply to
the other convenience libs required by the main sublibrary, so I trivially
removed them all.

  The changes to the boehm-gc are largely mechanical, and basically involve
turning on the pseudo-support for DYNAMIC_LOADING that is implemented for the
other windows hosts.  I simplified away the version checking, because cygwin
never runs on any windows version that doesn't support DLLs (i.e. win32s), and
it uses the unix get mem function so as to get memory from the cygwin
allocator rather than allocating it from the windows api "behind cygwin's
back"; apart from that, the usage of the VirtualQuery to determine memory
ranges and properties will be absolutely fine on Cygwin, so I didn't try and
rewrite it to use something based on mprotect() or whatever other posix api.


pr42811-final.diff:
libjava/ChangeLog:

	PR java/42811
	* configure.ac (libgcj_spec_lgcj_override): Add undefined reference
	to arbitrary symbol in noncore library.
	(libgcj_spec_lgcj_bc_override): Likewise.
	configure: Regenerate.

pr42811-associated-uninitmem-fix.diff:
libjava/ChangeLog:

	* jvmti.cc (_Jv_GetJVMTIEnv): Avoid use of uninitialised memory.

pr42811-associated-dead-lib-code-link-fix.diff:
libjava/ChangeLog:

	* Makefile.am (libgcj_noncore_la_LIBADD): Don't include standard
	list of libtool convenience libs only needed by main library.
	* Makefile.in: Regenerate.

pr42811-associated-gc-fixes.diff:
boehm-gc/ChangeLog:

	* include/private/gc_priv.h (struct roots) [CYGWIN32]: Don't
	declare r_next member on Cygwin as on other windows hosts.
	(LOG_RT_SIZE) [CYGWIN32]: Don't define likewise.
	(RT_SIZE) [CYGWIN32]: Likewise.
	(struct _GC_arrays) [CYGWIN32]: Do declare _heap_bases[] member
	likewise.
	(GC_heap_bases) [CYGWIN32]: Do define likewise.
	(struct _SYSTEM_INFO) [CYGWIN32]: Do forward-declare likewise.
	(GC_sysinfo) [CYGWIN32]: Do declare extern likewise.
	(GC_n_heap_bases) [CYGWIN32]: Likewise.
	(GC_is_tmp_root) [CYGWIN32]: Do prototype likewise.
	* include/private/gcconfig.h (GC_win32_get_mem) [CYGWIN32]: Likewise.
	(GET_MEM) [CYGWIN32]: Do define likewise.
	* boehm-gc/ptr_chck.c (GC_is_visible) [CYGWIN32]: Do handle dynamic
	registration likewise.
	* boehm-gc/os_dep.c (GC_setpagesize) [CYGWIN32]: Do define likewise.
	(GC_no_win32_dlls) [CYGWIN32]: Define as constant false, unlike
	other windows hosts.
	(GC_sysinfo) [CYGWIN32]: Define as on other windows hosts.
	(GC_n_heap_bases) [CYGWIN32]: Likewise.
	(GLOBAL_ALLOC_TEST) [CYGWIN32]: Likewise.
	(GC_win32_get_mem) [CYGWIN32]: Likewise, but wrapping GC_unix_get_mem
	rather than GlobalAlloc/VirtualAlloc.
	(GC_win32_free_heap) [CYGWIN32]: Likewise, but wrapping free instead
	of GlobalFree (even though the function body is optimised away).
	* boehm-gc/mark_rts.c (add_roots_to_index) [CYGWIN32]: Define as on
	other windows hosts.
	(GC_add_roots_inner) [CYGWIN32]: Avoid overlapping or adjacent
	intervals likewise.
	(GC_clear_roots) [CYGWIN32]: Clear GC_root_index[] likewise.
	(GC_rebuild_root_index) [CYGWIN32]: Define as on other windows hosts.
	(GC_remove_tmp_roots) [CYGWIN32]: Call it likewise.
	(GC_remove_roots) [CYGWIN32]: Don't define, as on other windows hosts.
	(GC_is_tmp_root) [CYGWIN32]: Define, as on other windows hosts.
	(GC_cond_register_dynamic_libraries) [CYGWIN32]: Handle temporary
	roots and dynamic registration likewise.
	* boehm-gc/dyn_load.c (GC_has_static_roots) [CYGWIN32]: Define as on
	other windows hosts.
	(GC_register_has_static_roots_callback) [CYGWIN32]: Likewise.
	(GC_cond_add_roots) [CYGWIN32]: Likewise.
	(GC_register_main_static_data) [CYGWIN32]: Define to always return
	false, as on MSWINCE
	(HAVE_REGISTER_MAIN_STATIC_DATA) [CYGWIN32]: Define as on other
	windows hosts.
	(GC_warn_fb) [CYGWIN32]: Likewise.
	(GC_disallow_ignore_fb) [CYGWIN32]: Likewise.
	(GC_ignore_fb_mb) [CYGWIN32]: Likewise.
	(GC_ignore_fb) [CYGWIN32]: Likewise.
	(is_frame_buffer) [CYGWIN32]: Likewise.
	(GC_dump_meminfo) [CYGWIN32]: Likewise.
	(GC_wnt) [CYGWIN32]: Define to constant true.
	(GC_register_dynamic_libraries) [CYGWIN32]: Define as on other
	windows hosts.


  Bootstrapped and tested on i686-pc-cygwin; fixes PR42811 and doesn't cause
any further regressions (there are some preexisting fails that this makes no
difference to).  OK for head?

    cheers,
      DaveK

Index: libjava/configure.ac
===================================================================
--- libjava/configure.ac	(revision 156830)
+++ libjava/configure.ac	(working copy)
@@ -244,9 +244,13 @@ if test "$enable_libgcj_sublibs" = yes ; then
   # tag "_bc" onto the end of it when we use it to generate the
   # spec, but that's an ugly thing to do when there are multiple
   # words in the string and you're relying on the ordering to
-  # append the correct one.
-  libgcj_spec_lgcj_override="-lgcj-noncore -lgcj"
-  libgcj_spec_lgcj_bc_override="-lgcj-noncore -lgcj_bc"
+  # append the correct one.  Note that we add an arbitrary undef
+  # from libgcj-noncore to ensure the library is actually linked
+  # and loaded, as there aren't static dependencies to tell us
+  # which classes will be loaded at runtime, so we need to ensure
+  # that all the class data (.jcr sections) are present and initialised.
+  libgcj_spec_lgcj_override="-lgcj-noncore -u__ZN3org4ietf4jgss10GSSManagerC1Ev -lgcj"
+  libgcj_spec_lgcj_bc_override="-lgcj-noncore -u__ZN3org4ietf4jgss10GSSManagerC1Ev -lgcj_bc"
 fi
 
 
Index: libjava/jvmti.cc
===================================================================
--- libjava/jvmti.cc	(revision 156830)
+++ libjava/jvmti.cc	(working copy)
@@ -2210,6 +2210,7 @@ _Jv_GetJVMTIEnv (void)
 {
   _Jv_JVMTIEnv *env
     = (_Jv_JVMTIEnv *) _Jv_MallocUnchecked (sizeof (_Jv_JVMTIEnv));
+  memset (env, 0, sizeof (_Jv_JVMTIEnv));
   env->p = &_Jv_JVMTI_Interface;
   struct jvmti_env_list *element
     = (struct jvmti_env_list *) _Jv_MallocUnchecked (sizeof (struct jvmti_env_list));
Index: libjava/Makefile.am
===================================================================
--- libjava/Makefile.am	(revision 156830)
+++ libjava/Makefile.am	(working copy)
@@ -474,8 +474,7 @@ EXTRA_libgcj_la_SOURCES = java/lang/Object.java
 if BUILD_SUBLIBS
 libgcj_noncore_la_SOURCES =
 libgcj_noncore_la_LDFLAGS = $(libgcj_la_LDFLAGS)
-libgcj_noncore_la_LIBADD = $(libgcj_noncore_la_LIBADD_SUBOBJECTS) \
-		$(LIBFFI) $(ZLIBS) $(GCLIBS) libgcj.la
+libgcj_noncore_la_LIBADD = $(libgcj_noncore_la_LIBADD_SUBOBJECTS) libgcj.la
 libgcj_noncore_la_DEPENDENCIES = libgcj-$(gcc_version).jar $(LIBLTDL) \
 		$(libgcj_noncore_la_LIBADD) libgcj.la
 if ANONVERSCRIPT
Index: boehm-gc/include/private/gc_priv.h
===================================================================
--- boehm-gc/include/private/gc_priv.h	(revision 156830)
+++ boehm-gc/include/private/gc_priv.h	(working copy)
@@ -833,14 +833,14 @@ struct exclusion {
 struct roots {
 	ptr_t r_start;
 	ptr_t r_end;
-#	if !defined(MSWIN32) && !defined(MSWINCE)
+#	if !defined(MSWIN32) && !defined(MSWINCE) && !defined(CYGWIN32)
 	  struct roots * r_next;
 #	endif
 	GC_bool r_tmp;
 	  	/* Delete before registering new dynamic libraries */
 };
 
-#if !defined(MSWIN32) && !defined(MSWINCE)
+#if !defined(MSWIN32) && !defined(MSWINCE) && !defined(CYGWIN32)
     /* Size of hash table index to roots.	*/
 #   define LOG_RT_SIZE 6
 #   define RT_SIZE (1 << LOG_RT_SIZE) /* Power of 2, may be != MAX_ROOT_SETS */
@@ -1024,7 +1024,7 @@ struct _GC_arrays {
   struct HeapSect {
       ptr_t hs_start; word hs_bytes;
   } _heap_sects[MAX_HEAP_SECTS];
-# if defined(MSWIN32) || defined(MSWINCE)
+# if defined(MSWIN32) || defined(MSWINCE) || defined(CYGWIN32)
     ptr_t _heap_bases[MAX_HEAP_SECTS];
     		/* Start address of memory regions obtained from kernel. */
 # endif
@@ -1033,7 +1033,7 @@ struct _GC_arrays {
     		/* Commited lengths of memory regions obtained from kernel. */
 # endif
   struct roots _static_roots[MAX_ROOT_SETS];
-# if !defined(MSWIN32) && !defined(MSWINCE)
+# if !defined(MSWIN32) && !defined(MSWINCE) && !defined(CYGWIN32)
     struct roots * _root_index[RT_SIZE];
 # endif
   struct exclusion _excl_table[MAX_EXCLUSIONS];
@@ -1091,7 +1091,7 @@ GC_API GC_FAR struct _GC_arrays GC_arrays;
 # ifdef USE_MUNMAP
 #   define GC_unmapped_bytes GC_arrays._unmapped_bytes
 # endif
-# if defined(MSWIN32) || defined(MSWINCE)
+# if defined(MSWIN32) || defined(MSWINCE) || defined (CYGWIN32)
 #   define GC_heap_bases GC_arrays._heap_bases
 # endif
 # ifdef MSWINCE
@@ -1187,7 +1187,7 @@ extern word GC_n_heap_sects;	/* Number of separate
 
 extern word GC_page_size;
 
-# if defined(MSWIN32) || defined(MSWINCE)
+# if defined(MSWIN32) || defined(MSWINCE) || defined(CYGWIN32)
   struct _SYSTEM_INFO;
   extern struct _SYSTEM_INFO GC_sysinfo;
   extern word GC_n_heap_bases;	/* See GC_heap_bases.	*/
@@ -1479,7 +1479,7 @@ void GC_remove_roots_inner GC_PROTO((char * b, cha
 GC_bool GC_is_static_root GC_PROTO((ptr_t p));
   		/* Is the address p in one of the registered static	*/
   		/* root sections?					*/
-# if defined(MSWIN32) || defined(_WIN32_WCE_EMULATION)
+# if defined(MSWIN32) || defined(_WIN32_WCE_EMULATION) || defined(CYGWIN32)
 GC_bool GC_is_tmp_root GC_PROTO((ptr_t p));
 		/* Is the address p in one of the temporary static	*/
 		/* root sections?					*/
Index: boehm-gc/include/private/gcconfig.h
===================================================================
--- boehm-gc/include/private/gcconfig.h	(revision 156830)
+++ boehm-gc/include/private/gcconfig.h	(working copy)
@@ -2375,7 +2375,7 @@
 					      calloc(1, (size_t)bytes + GC_page_size) \
 					      + GC_page_size-1)
 #     else
-#	ifdef MSWIN32
+#	if defined(MSWIN32) || defined(CYGWIN32)
 	  extern ptr_t GC_win32_get_mem();
 #         define GET_MEM(bytes) (struct hblk *)GC_win32_get_mem(bytes)
 #	else
Index: boehm-gc/ptr_chck.c
===================================================================
--- boehm-gc/ptr_chck.c	(revision 156830)
+++ boehm-gc/ptr_chck.c	(working copy)
@@ -247,7 +247,7 @@ ptr_t p;
     	    if (GC_is_static_root(p)) return(p);
     	    /* Else do it again correctly:	*/
 #           if (defined(DYNAMIC_LOADING) || defined(MSWIN32) || \
-		defined(MSWINCE) || defined(PCR)) \
+		defined(MSWINCE) || defined (CYGWIN32) || defined(PCR)) \
                 && !defined(SRC_M3)
     	        DISABLE_SIGNALS();
     	        GC_register_dynamic_libraries();
Index: boehm-gc/os_dep.c
===================================================================
--- boehm-gc/os_dep.c	(revision 156830)
+++ boehm-gc/os_dep.c	(working copy)
@@ -107,7 +107,7 @@
 # undef GC_AMIGA_DEF
 #endif
 
-#if defined(MSWIN32) || defined(MSWINCE)
+#if defined(MSWIN32) || defined(MSWINCE) || defined(CYGWIN32)
 # define WIN32_LEAN_AND_MEAN
 # define NOSERVICE
 # include <windows.h>
@@ -584,7 +584,7 @@ void GC_enable_signals()
 /* Find the page size */
 word GC_page_size;
 
-# if defined(MSWIN32) || defined(MSWINCE)
+# if defined(MSWIN32) || defined(MSWINCE) || defined (CYGWIN32)
   void GC_setpagesize()
   {
     GetSystemInfo(&GC_sysinfo);
@@ -1169,8 +1169,12 @@ void GC_register_data_segments()
 
 # else /* !OS2 */
 
-# if defined(MSWIN32) || defined(MSWINCE)
+# if defined(MSWIN32) || defined(MSWINCE) || defined (CYGWIN32)
 
+# ifdef CYGWIN32
+#    define GC_no_win32_dlls (FALSE)
+# endif
+
 # ifdef MSWIN32
   /* Unfortunately, we have to handle win32s very differently from NT, 	*/
   /* Since VirtualQuery has very different semantics.  In particular,	*/
@@ -1664,25 +1668,28 @@ void * os2_alloc(size_t bytes)
 # endif /* OS2 */
 
 
-# if defined(MSWIN32) || defined(MSWINCE)
+# if defined(MSWIN32) || defined(MSWINCE) || defined(CYGWIN32)
 SYSTEM_INFO GC_sysinfo;
 # endif
 
-# ifdef MSWIN32
+# if defined(MSWIN32) || defined(CYGWIN32)
 
+word GC_n_heap_bases = 0;
+
 # ifdef USE_GLOBAL_ALLOC
 #   define GLOBAL_ALLOC_TEST 1
 # else
 #   define GLOBAL_ALLOC_TEST GC_no_win32_dlls
 # endif
 
-word GC_n_heap_bases = 0;
-
 ptr_t GC_win32_get_mem(bytes)
 word bytes;
 {
     ptr_t result;
 
+# ifdef CYGWIN32
+    result = GC_unix_get_mem (bytes);
+# else
     if (GLOBAL_ALLOC_TEST) {
     	/* VirtualAlloc doesn't like PAGE_EXECUTE_READWRITE.	*/
     	/* There are also unconfirmed rumors of other		*/
@@ -1702,6 +1709,7 @@ word bytes;
     				      MEM_COMMIT | MEM_RESERVE,
     				      PAGE_EXECUTE_READWRITE);
     }
+#endif
     if (HBLKDISPL(result) != 0) ABORT("Bad VirtualAlloc result");
     	/* If I read the documentation correctly, this can	*/
     	/* only happen if HBLKSIZE > 64k or not a power of 2.	*/
@@ -1714,7 +1722,11 @@ void GC_win32_free_heap ()
 {
     if (GC_no_win32_dlls) {
  	while (GC_n_heap_bases > 0) {
+# ifdef CYGWIN32
+ 	    free (GC_heap_bases[--GC_n_heap_bases]);
+# else
  	    GlobalFree (GC_heap_bases[--GC_n_heap_bases]);
+# endif
  	    GC_heap_bases[GC_n_heap_bases] = 0;
  	}
     }
Index: boehm-gc/mark_rts.c
===================================================================
--- boehm-gc/mark_rts.c	(revision 156830)
+++ boehm-gc/mark_rts.c	(working copy)
@@ -22,7 +22,7 @@
 struct roots {
 	ptr_t r_start;
 	ptr_t r_end;
- #	if !defined(MSWIN32) && !defined(MSWINCE)
+ #	if !defined(MSWIN32) && !defined(MSWINCE) && !defined(CYGWIN32)
 	  struct roots * r_next;
  #	endif
 	GC_bool r_tmp;
@@ -87,7 +87,7 @@ ptr_t p;
     return(FALSE);
 }
 
-#if !defined(MSWIN32) && !defined(MSWINCE)
+#if !defined(MSWIN32) && !defined(MSWINCE) && !defined(CYGWIN32)
 /* 
 #   define LOG_RT_SIZE 6
 #   define RT_SIZE (1 << LOG_RT_SIZE)  -- Power of 2, may be != MAX_ROOT_SETS
@@ -139,7 +139,7 @@ struct roots *p;
     GC_root_index[h] = p;
 }
 
-# else /* MSWIN32 || MSWINCE */
+# else /* MSWIN32 || MSWINCE || CYGWIN32 */
 
 #   define add_roots_to_index(p)
 
@@ -175,7 +175,7 @@ GC_bool tmp;
 {
     struct roots * old;
     
-#   if defined(MSWIN32) || defined(MSWINCE)
+#   if defined(MSWIN32) || defined(MSWINCE) || defined(CYGWIN32)
       /* Spend the time to ensure that there are no overlapping	*/
       /* or adjacent intervals.					*/
       /* This could be done faster with e.g. a			*/
@@ -244,7 +244,7 @@ GC_bool tmp;
     GC_static_roots[n_root_sets].r_start = (ptr_t)b;
     GC_static_roots[n_root_sets].r_end = (ptr_t)e;
     GC_static_roots[n_root_sets].r_tmp = tmp;
-#   if !defined(MSWIN32) && !defined(MSWINCE)
+#   if !defined(MSWIN32) && !defined(MSWINCE) && !defined(CYGWIN32)
       GC_static_roots[n_root_sets].r_next = 0;
 #   endif
     add_roots_to_index(GC_static_roots + n_root_sets);
@@ -263,7 +263,7 @@ void GC_clear_roots GC_PROTO((void))
     roots_were_cleared = TRUE;
     n_root_sets = 0;
     GC_root_size = 0;
-#   if !defined(MSWIN32) && !defined(MSWINCE)
+#   if !defined(MSWIN32) && !defined(MSWINCE) && !defined(CYGWIN32)
     {
     	register int i;
     	
@@ -285,7 +285,7 @@ int i;
     n_root_sets--;
 }
 
-#if !defined(MSWIN32) && !defined(MSWINCE)
+#if !defined(MSWIN32) && !defined(MSWINCE) && !defined(CYGWIN32)
 static void GC_rebuild_root_index()
 {
     register int i;
@@ -308,12 +308,12 @@ void GC_remove_tmp_roots()
     	    i++;
     }
     }
-    #if !defined(MSWIN32) && !defined(MSWINCE)
+    #if !defined(MSWIN32) && !defined(MSWINCE) && !defined(CYGWIN32)
     GC_rebuild_root_index();
     #endif
 }
 
-#if !defined(MSWIN32) && !defined(MSWINCE)
+#if !defined(MSWIN32) && !defined(MSWINCE) && !defined(CYGWIN32)
 void GC_remove_roots(b, e)
 char * b; char * e;
 {
@@ -340,9 +340,9 @@ char * b; char * e;
     }
     GC_rebuild_root_index();
 }
-#endif /* !defined(MSWIN32) && !defined(MSWINCE) */
+#endif /* !defined(MSWIN32) && !defined(MSWINCE) && !defined(CYGWIN32) */
 
-#if defined(MSWIN32) || defined(_WIN32_WCE_EMULATION)
+#if defined(MSWIN32) || defined(_WIN32_WCE_EMULATION) || defined(CYGWIN32)
 /* Workaround for the OS mapping and unmapping behind our back:		*/
 /* Is the address p in one of the temporary static root sections?	*/
 GC_bool GC_is_tmp_root(p)
@@ -364,7 +364,7 @@ ptr_t p;
     }
     return(FALSE);
 }
-#endif /* MSWIN32 || _WIN32_WCE_EMULATION */
+#endif /* MSWIN32 || _WIN32_WCE_EMULATION || defined(CYGWIN32) */
 
 ptr_t GC_approx_sp()
 {
@@ -557,7 +557,7 @@ void GC_push_gc_structures GC_PROTO((void))
 void GC_cond_register_dynamic_libraries()
 {
 # if (defined(DYNAMIC_LOADING) || defined(MSWIN32) || defined(MSWINCE) \
-     || defined(PCR)) && !defined(SRC_M3)
+     || defined(CYGWIN32) || defined(PCR)) && !defined(SRC_M3)
     GC_remove_tmp_roots();
     if (!GC_no_dls) GC_register_dynamic_libraries();
 # else
Index: boehm-gc/dyn_load.c
===================================================================
--- boehm-gc/dyn_load.c	(revision 156830)
+++ boehm-gc/dyn_load.c	(working copy)
@@ -49,10 +49,13 @@
 #   undef GC_must_restore_redefined_dlopen
 # endif
 
-#if (defined(DYNAMIC_LOADING) || defined(MSWIN32) || defined(MSWINCE)) \
+#if (defined(DYNAMIC_LOADING) \
+	|| defined(MSWIN32)   \
+	|| defined(MSWINCE)   \
+	|| defined(CYGWIN32)) \
     && !defined(PCR)
 #if !defined(SUNOS4) && !defined(SUNOS5DL) && !defined(IRIX5) && \
-    !defined(MSWIN32) && !defined(MSWINCE) && \
+    !defined(MSWIN32) && !defined(MSWINCE) && !defined(CYGWIN32) && \
     !(defined(ALPHA) && defined(OSF1)) && \
     !defined(HPUX) && !(defined(LINUX) && defined(__ELF__)) && \
     !defined(RS6000) && !defined(SCO_ELF) && !defined(DGUX) && \
@@ -717,7 +720,7 @@ void GC_register_dynamic_libraries()
 
 # endif /* USE_PROC || IRIX5 */
 
-# if defined(MSWIN32) || defined(MSWINCE)
+# if defined(MSWIN32) || defined(MSWINCE) || defined(CYGWIN32)
 
 # define WIN32_LEAN_AND_MEAN
 # define NOSERVICE
@@ -761,7 +764,7 @@ void GC_register_dynamic_libraries()
     }
 # endif
 
-# ifdef MSWINCE
+# if defined(MSWINCE) || defined(CYGWIN32)
   /* Do we need to separately register the main static data segment? */
   GC_bool GC_register_main_static_data()
   {
@@ -868,8 +871,12 @@ void GC_register_dynamic_libraries()
   }
 # endif /* DEBUG_VIRTUALQUERY */
 
-  extern GC_bool GC_wnt;  /* Is Windows NT derivative.		*/
-  			  /* Defined and set in os_dep.c.	*/
+# ifdef CYGWIN32
+#   define GC_wnt (TRUE)
+# else
+    extern GC_bool GC_wnt;  /* Is Windows NT derivative.	*/
+  			    /* Defined and set in os_dep.c.	*/
+# endif
 
   void GC_register_dynamic_libraries()
   {
@@ -934,7 +941,7 @@ void GC_register_dynamic_libraries()
     GC_cond_add_roots(base, limit);
   }
 
-#endif /* MSWIN32 || MSWINCE */
+#endif /* MSWIN32 || MSWINCE || CYGWIN32 */
   
 #if defined(ALPHA) && defined(OSF1)
 

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]