OSDN Git Service

libjava:
[pf3gnuchains/gcc-fork.git] / boehm-gc / include / private / gcconfig.h
1 /* 
2  * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
3  * Copyright (c) 1991-1994 by Xerox Corporation.  All rights reserved.
4  * Copyright (c) 1996 by Silicon Graphics.  All rights reserved.
5  * Copyright (c) 2000-2004 Hewlett-Packard Development Company, L.P.
6  *
7  * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
8  * OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
9  *
10  * Permission is hereby granted to use or copy this program
11  * for any purpose,  provided the above notices are retained on all copies.
12  * Permission to modify the code and to distribute modified code is granted,
13  * provided the above notices are retained, and a notice that the code was
14  * modified is included with the above copyright notice.
15  */
16
17 /*
18  * This header is private to the gc.  It is almost always included from
19  * gc_priv.h.  However it is possible to include it by itself if just the
20  * configuration macros are needed.  In that
21  * case, a few declarations relying on types declared in gc_priv.h will be
22  * omitted.
23  */
24  
25 #ifndef GCCONFIG_H
26
27 # define GCCONFIG_H
28
29 # ifndef GC_PRIVATE_H
30     /* Fake ptr_t declaration, just to avoid compilation errors.        */
31     /* This avoids many instances if "ifndef GC_PRIVATE_H" below.       */
32     typedef struct GC_undefined_struct * ptr_t;
33 # endif
34
35 /* Machine dependent parameters.  Some tuning parameters can be found   */
36 /* near the top of gc_private.h.                                        */
37
38 /* Machine specific parts contributed by various people.  See README file. */
39
40 /* First a unified test for Linux: */
41 # if defined(linux) || defined(__linux__)
42 #  ifndef LINUX
43 #    define LINUX
44 #  endif
45 # endif
46
47 /* And one for NetBSD: */
48 # if defined(__NetBSD__)
49 #    define NETBSD
50 # endif
51
52 /* And one for OpenBSD: */
53 # if defined(__OpenBSD__)
54 #    define OPENBSD
55 # endif
56
57 /* And one for FreeBSD: */
58 # if defined(__FreeBSD__)
59 #    define FREEBSD
60 # endif
61
62 /* Determine the machine type: */
63 # if defined(__arm__) || defined(__thumb__)
64 #    define ARM32
65 #    if !defined(LINUX) && !defined(NETBSD)
66 #      define NOSYS
67 #      define mach_type_known
68 #    endif
69 # endif
70 # if defined(sun) && defined(mc68000)
71 #    define M68K
72 #    define SUNOS4
73 #    define mach_type_known
74 # endif
75 # if defined(hp9000s300)
76 #    define M68K
77 #    define HP
78 #    define mach_type_known
79 # endif
80 # if defined(OPENBSD) && defined(m68k)
81 #    define M68K
82 #    define mach_type_known
83 # endif
84 # if defined(OPENBSD) && defined(__sparc__)
85 #    define SPARC
86 #    define mach_type_known
87 # endif
88 # if defined(NETBSD) && (defined(m68k) || defined(__m68k__))
89 #    define M68K
90 #    define mach_type_known
91 # endif
92 # if defined(NETBSD) && defined(__powerpc__)
93 #    define POWERPC
94 #    define mach_type_known
95 # endif
96 # if defined(NETBSD) && (defined(__arm32__) || defined(__arm__))
97 #    define ARM32
98 #    define mach_type_known
99 # endif
100 # if defined(vax)
101 #    define VAX
102 #    ifdef ultrix
103 #       define ULTRIX
104 #    else
105 #       define BSD
106 #    endif
107 #    define mach_type_known
108 # endif
109 # if defined(__NetBSD__) && defined(__vax__)
110 #    define VAX
111 #    define mach_type_known
112 # endif
113 # if defined(mips) || defined(__mips) || defined(_mips)
114 #    define MIPS
115 #    if defined(nec_ews) || defined(_nec_ews)
116 #      define EWS4800
117 #    endif
118 #    if !defined(LINUX) && !defined(EWS4800) && !defined(NETBSD)
119 #      if defined(ultrix) || defined(__ultrix)
120 #        define ULTRIX
121 #      else
122 #        if defined(_SYSTYPE_SVR4) || defined(SYSTYPE_SVR4) \
123             || defined(__SYSTYPE_SVR4__)
124 #          define IRIX5   /* or IRIX 6.X */
125 #        else
126 #          define RISCOS  /* or IRIX 4.X */
127 #        endif
128 #      endif
129 #    endif /* !LINUX */
130 #    define mach_type_known
131 # endif
132 # if defined(DGUX) && (defined(i386) || defined(__i386__))
133 #    define I386
134 #    ifndef _USING_DGUX
135 #    define _USING_DGUX
136 #    endif
137 #    define mach_type_known
138 # endif
139 # if defined(sequent) && (defined(i386) || defined(__i386__))
140 #    define I386
141 #    define SEQUENT
142 #    define mach_type_known
143 # endif
144 # if defined(sun) && (defined(i386) || defined(__i386__))
145 #    define I386
146 #    define SUNOS5
147 #    define mach_type_known
148 # endif
149 # if (defined(__OS2__) || defined(__EMX__)) && defined(__32BIT__)
150 #    define I386
151 #    define OS2
152 #    define mach_type_known
153 # endif
154 # if defined(ibm032)
155 #   define RT
156 #   define mach_type_known
157 # endif
158 # if defined(sun) && (defined(sparc) || defined(__sparc))
159 #   define SPARC
160     /* Test for SunOS 5.x */
161 #     include <errno.h>
162 #     ifdef ECHRNG
163 #       define SUNOS5
164 #     else
165 #       define SUNOS4
166 #     endif
167 #   define mach_type_known
168 # endif
169 # if defined(sparc) && defined(unix) && !defined(sun) && !defined(linux) \
170      && !defined(__OpenBSD__) && !(__NetBSD__)
171 #   define SPARC
172 #   define DRSNX
173 #   define mach_type_known
174 # endif
175 # if defined(_IBMR2)
176 #   define RS6000
177 #   define mach_type_known
178 # endif
179 # if defined(__NetBSD__) && defined(__sparc__)
180 #   define SPARC
181 #   define mach_type_known
182 # endif
183 # if defined(_M_XENIX) && defined(_M_SYSV) && defined(_M_I386)
184         /* The above test may need refinement   */
185 #   define I386
186 #   if defined(_SCO_ELF)
187 #     define SCO_ELF
188 #   else
189 #     define SCO
190 #   endif
191 #   define mach_type_known
192 # endif
193 # if defined(_AUX_SOURCE)
194 #   define M68K
195 #   define SYSV
196 #   define mach_type_known
197 # endif
198 # if defined(_PA_RISC1_0) || defined(_PA_RISC1_1) || defined(_PA_RISC2_0) \
199      || defined(hppa) || defined(__hppa__)
200 #   define HP_PA
201 #   ifndef LINUX
202 #     define HPUX
203 #   endif
204 #   define mach_type_known
205 # endif
206 # if defined(__ia64) && defined(_HPUX_SOURCE)
207 #   define IA64
208 #   define HPUX
209 #   define mach_type_known
210 # endif
211 # if defined(__BEOS__) && defined(_X86_)
212 #    define I386
213 #    define BEOS
214 #    define mach_type_known
215 # endif
216 # if defined(LINUX) && (defined(i386) || defined(__i386__))
217 #    define I386
218 #    define mach_type_known
219 # endif
220 # if defined(LINUX) && defined(__x86_64__)
221 #    define X86_64
222 #    define mach_type_known
223 # endif
224 # if defined(LINUX) && (defined(__ia64__) || defined(__ia64))
225 #    define IA64
226 #    define mach_type_known
227 # endif
228 # if defined(LINUX) && defined(__arm__)
229 #    define ARM32
230 #    define mach_type_known
231 # endif
232 # if defined(LINUX) && (defined(powerpc) || defined(__powerpc__) || defined(powerpc64) || defined(__powerpc64__))
233 #    define POWERPC
234 #    define mach_type_known
235 # endif
236 # if defined(LINUX) && defined(__mc68000__)
237 #    define M68K
238 #    define mach_type_known
239 # endif
240 # if defined(LINUX) && (defined(sparc) || defined(__sparc__))
241 #    define SPARC
242 #    define mach_type_known
243 # endif
244 # if defined(LINUX) && defined(__arm__)
245 #    define ARM32
246 #    define mach_type_known
247 # endif
248 # if defined(LINUX) && defined(__sh__)
249 #    define SH
250 #    define mach_type_known
251 # endif
252 # if defined(__alpha) || defined(__alpha__)
253 #   define ALPHA
254 #   if !defined(LINUX) && !defined(NETBSD) && !defined(OPENBSD) && !defined(FREEBSD)
255 #     define OSF1       /* a.k.a Digital Unix */
256 #   endif
257 #   define mach_type_known
258 # endif
259 # if defined(_AMIGA) && !defined(AMIGA)
260 #   define AMIGA
261 # endif
262 # ifdef AMIGA 
263 #   define M68K
264 #   define mach_type_known
265 # endif
266 # if defined(THINK_C) || defined(__MWERKS__) && !defined(__powerc)
267 #   define M68K
268 #   define MACOS
269 #   define mach_type_known
270 # endif
271 # if defined(__MWERKS__) && defined(__powerc) && !defined(__MACH__)
272 #   define POWERPC
273 #   define MACOS
274 #   define mach_type_known
275 # endif
276 # if defined(macosx) || \
277      defined(__APPLE__) && defined(__MACH__) && defined(__ppc__)
278 #    define DARWIN
279 #    define POWERPC
280 #    define mach_type_known
281 # endif
282 # if defined(__APPLE__) && defined(__MACH__) && defined(__i386__)
283 #    define DARWIN
284 #    define I386
285      --> Not really supported, but at least we recognize it.
286 # endif
287 # if defined(NeXT) && defined(mc68000)
288 #   define M68K
289 #   define NEXT
290 #   define mach_type_known
291 # endif
292 # if defined(NeXT) && (defined(i386) || defined(__i386__))
293 #   define I386
294 #   define NEXT
295 #   define mach_type_known
296 # endif
297 # if defined(__OpenBSD__) && (defined(i386) || defined(__i386__))
298 #   define I386
299 #   define OPENBSD
300 #   define mach_type_known
301 # endif
302 # if defined(FREEBSD) && (defined(i386) || defined(__i386__))
303 #   define I386
304 #   define mach_type_known
305 # endif
306 # if defined(__NetBSD__) && (defined(i386) || defined(__i386__))
307 #   define I386
308 #   define mach_type_known
309 # endif
310 # if defined(__NetBSD__) && defined(__x86_64__)
311 #    define X86_64
312 #    define mach_type_known
313 # endif
314 # if defined(bsdi) && (defined(i386) || defined(__i386__))
315 #    define I386
316 #    define BSDI
317 #    define mach_type_known
318 # endif
319 # if !defined(mach_type_known) && defined(__386BSD__)
320 #   define I386
321 #   define THREE86BSD
322 #   define mach_type_known
323 # endif
324 # if defined(_CX_UX) && defined(_M88K)
325 #   define M88K
326 #   define CX_UX
327 #   define mach_type_known
328 # endif
329 # if defined(DGUX) && defined(m88k)
330 #   define M88K
331     /* DGUX defined */
332 #   define mach_type_known
333 # endif
334 # if defined(_WIN32_WCE)
335     /* SH3, SH4, MIPS already defined for corresponding architectures */
336 #   if defined(SH3) || defined(SH4)
337 #     define SH
338 #   endif
339 #   if defined(x86)
340 #     define I386
341 #   endif
342 #   if defined(ARM)
343 #     define ARM32
344 #   endif
345 #   define MSWINCE
346 #   define mach_type_known
347 # else
348 #   if (defined(_MSDOS) || defined(_MSC_VER)) && (_M_IX86 >= 300) \
349         || defined(_WIN32) && !defined(__CYGWIN32__) && !defined(__CYGWIN__)
350 #     define I386
351 #     define MSWIN32    /* or Win32s */
352 #     define mach_type_known
353 #   endif
354 #   if defined(_MSC_VER) && defined(_M_IA64)
355 #     define IA64
356 #     define MSWIN32    /* Really win64, but we don't treat 64-bit      */
357                         /* variants as a differnt platform.             */
358 #   endif
359 # endif
360 # if defined(__DJGPP__)
361 #   define I386
362 #   ifndef DJGPP
363 #     define DJGPP  /* MSDOS running the DJGPP port of GCC */
364 #   endif
365 #   define mach_type_known
366 # endif
367 # if defined(__CYGWIN32__) || defined(__CYGWIN__)
368 #   define I386
369 #   define CYGWIN32
370 #   define mach_type_known
371 # endif
372 # if defined(__MINGW32__)
373 #   define I386
374 #   define MSWIN32
375 #   define mach_type_known
376 # endif
377 # if defined(__BORLANDC__)
378 #   define I386
379 #   define MSWIN32
380 #   define mach_type_known
381 # endif
382 # if defined(_UTS) && !defined(mach_type_known)
383 #   define S370
384 #   define UTS4
385 #   define mach_type_known
386 # endif
387 # if defined(__pj__)
388 #   define PJ
389 #   define mach_type_known
390 # endif
391 # if defined(__embedded__) && defined(PPC)
392 #   define POWERPC
393 #   define NOSYS
394 #   define mach_type_known
395 # endif
396 /* Ivan Demakov */
397 # if defined(__WATCOMC__) && defined(__386__)
398 #   define I386
399 #   if !defined(OS2) && !defined(MSWIN32) && !defined(DOS4GW)
400 #     if defined(__OS2__)
401 #       define OS2
402 #     else
403 #       if defined(__WINDOWS_386__) || defined(__NT__)
404 #         define MSWIN32
405 #       else
406 #         define DOS4GW
407 #       endif
408 #     endif
409 #   endif
410 #   define mach_type_known
411 # endif
412 # if defined(__s390__) && defined(LINUX)
413 #    define S390
414 #    define mach_type_known
415 # endif
416 # if defined(__GNU__)
417 #   if defined(__i386__)
418 /* The Debian Hurd running on generic PC */  
419 #     define  HURD
420 #     define  I386
421 #     define  mach_type_known
422 #    endif 
423 # endif
424
425 /* Feel free to add more clauses here */
426
427 /* Or manually define the machine type here.  A machine type is         */
428 /* characterized by the architecture.  Some                             */
429 /* machine types are further subdivided by OS.                          */
430 /* the macros ULTRIX, RISCOS, and BSD to distinguish.                   */
431 /* Note that SGI IRIX is treated identically to RISCOS.                 */
432 /* SYSV on an M68K actually means A/UX.                                 */
433 /* The distinction in these cases is usually the stack starting address */
434 # ifndef mach_type_known
435         --> unknown machine type
436 # endif
437                     /* Mapping is: M68K       ==> Motorola 680X0        */
438                     /*             (SUNOS4,HP,NEXT, and SYSV (A/UX),    */
439                     /*             MACOS and AMIGA variants)            */
440                     /*             I386       ==> Intel 386             */
441                     /*              (SEQUENT, OS2, SCO, LINUX, NETBSD,  */
442                     /*               FREEBSD, THREE86BSD, MSWIN32,      */
443                     /*               BSDI,SUNOS5, NEXT, other variants) */
444                     /*             NS32K      ==> Encore Multimax       */
445                     /*             MIPS       ==> R2000 or R3000        */
446                     /*                  (RISCOS, ULTRIX variants)       */
447                     /*             VAX        ==> DEC VAX               */
448                     /*                  (BSD, ULTRIX variants)          */
449                     /*             RS6000     ==> IBM RS/6000 AIX3.X    */
450                     /*             RT         ==> IBM PC/RT             */
451                     /*             HP_PA      ==> HP9000/700 & /800     */
452                     /*                            HP/UX, LINUX          */
453                     /*             SPARC      ==> SPARC v7/v8/v9        */
454                     /*                  (SUNOS4, SUNOS5, LINUX,         */
455                     /*                   DRSNX variants)                */
456                     /*             ALPHA      ==> DEC Alpha             */
457                     /*                  (OSF1 and LINUX variants)       */
458                     /*             M88K       ==> Motorola 88XX0        */
459                     /*                  (CX_UX and DGUX)                */
460                     /*             S370       ==> 370-like machine      */
461                     /*                  running Amdahl UTS4             */
462                     /*             S390       ==> 390-like machine      */
463                     /*                  running LINUX                   */
464                     /*             ARM32      ==> Intel StrongARM       */
465                     /*             IA64       ==> Intel IPF             */
466                     /*                            (e.g. Itanium)        */
467                     /*                  (LINUX and HPUX)                */
468                     /*             SH         ==> Hitachi SuperH        */
469                     /*                  (LINUX & MSWINCE)               */
470                     /*             X86_64     ==> AMD x86-64            */
471                     /*             POWERPC    ==> IBM/Apple PowerPC     */
472                     /*                  (MACOS(<=9),DARWIN(incl.MACOSX),*/
473                     /*                   LINUX, NETBSD, NOSYS variants) */
474
475
476 /*
477  * For each architecture and OS, the following need to be defined:
478  *
479  * CPP_WORD_SZ is a simple integer constant representing the word size.
480  * in bits.  We assume byte addressibility, where a byte has 8 bits.
481  * We also assume CPP_WORD_SZ is either 32 or 64.
482  * (We care about the length of pointers, not hardware
483  * bus widths.  Thus a 64 bit processor with a C compiler that uses
484  * 32 bit pointers should use CPP_WORD_SZ of 32, not 64. Default is 32.)
485  *
486  * MACH_TYPE is a string representation of the machine type.
487  * OS_TYPE is analogous for the OS.
488  *
489  * ALIGNMENT is the largest N, such that
490  * all pointer are guaranteed to be aligned on N byte boundaries.
491  * defining it to be 1 will always work, but perform poorly.
492  *
493  * DATASTART is the beginning of the data segment.
494  * On some platforms SEARCH_FOR_DATA_START is defined.
495  * SEARCH_FOR_DATASTART will cause GC_data_start to
496  * be set to an address determined by accessing data backwards from _end
497  * until an unmapped page is found.  DATASTART will be defined to be
498  * GC_data_start.
499  * On UNIX-like systems, the collector will scan the area between DATASTART
500  * and DATAEND for root pointers.
501  *
502  * DATAEND, if not `end' where `end' is defined as ``extern int end[];''.
503  * RTH suggests gaining access to linker script synth'd values with
504  * this idiom instead of `&end' where `end' is defined as ``extern int end;'' .
505  * Otherwise, ``GCC will assume these are in .sdata/.sbss'' and it will, e.g.,
506  * cause failures on alpha*-*-* with ``-msmall-data or -fpic'' or mips-*-*
507  * without any special options.
508  *
509  * ALIGN_DOUBLE of GC_malloc should return blocks aligned to twice
510  * the pointer size.
511  *
512  * STACKBOTTOM is the cool end of the stack, which is usually the
513  * highest address in the stack.
514  * Under PCR or OS/2, we have other ways of finding thread stacks.
515  * For each machine, the following should:
516  * 1) define STACK_GROWS_UP if the stack grows toward higher addresses, and
517  * 2) define exactly one of
518  *      STACKBOTTOM (should be defined to be an expression)
519  *      LINUX_STACKBOTTOM
520  *      HEURISTIC1
521  *      HEURISTIC2
522  * If STACKBOTTOM is defined, then it's value will be used directly as the
523  * stack base.  If LINUX_STACKBOTTOM is defined, then it will be determined
524  * with a method appropriate for most Linux systems.  Currently we look
525  * first for __libc_stack_end, and if that fails read it from /proc.
526  * If either of the last two macros are defined, then STACKBOTTOM is computed
527  * during collector startup using one of the following two heuristics:
528  * HEURISTIC1:  Take an address inside GC_init's frame, and round it up to
529  *              the next multiple of STACK_GRAN.
530  * HEURISTIC2:  Take an address inside GC_init's frame, increment it repeatedly
531  *              in small steps (decrement if STACK_GROWS_UP), and read the value
532  *              at each location.  Remember the value when the first
533  *              Segmentation violation or Bus error is signalled.  Round that
534  *              to the nearest plausible page boundary, and use that instead
535  *              of STACKBOTTOM.
536  *
537  * Gustavo Rodriguez-Rivera points out that on most (all?) Unix machines,
538  * the value of environ is a pointer that can serve as STACKBOTTOM.
539  * I expect that HEURISTIC2 can be replaced by this approach, which
540  * interferes far less with debugging.  However it has the disadvantage
541  * that it's confused by a putenv call before the collector is initialized.
542  * This could be dealt with by intercepting putenv ...
543  *
544  * If no expression for STACKBOTTOM can be found, and neither of the above
545  * heuristics are usable, the collector can still be used with all of the above
546  * undefined, provided one of the following is done:
547  * 1) GC_mark_roots can be changed to somehow mark from the correct stack(s)
548  *    without reference to STACKBOTTOM.  This is appropriate for use in
549  *    conjunction with thread packages, since there will be multiple stacks.
550  *    (Allocating thread stacks in the heap, and treating them as ordinary
551  *    heap data objects is also possible as a last resort.  However, this is
552  *    likely to introduce significant amounts of excess storage retention
553  *    unless the dead parts of the thread stacks are periodically cleared.)
554  * 2) Client code may set GC_stackbottom before calling any GC_ routines.
555  *    If the author of the client code controls the main program, this is
556  *    easily accomplished by introducing a new main program, setting
557  *    GC_stackbottom to the address of a local variable, and then calling
558  *    the original main program.  The new main program would read something
559  *    like:
560  *
561  *              # include "gc_private.h"
562  *
563  *              main(argc, argv, envp)
564  *              int argc;
565  *              char **argv, **envp;
566  *              {
567  *                  int dummy;
568  *
569  *                  GC_stackbottom = (ptr_t)(&dummy);
570  *                  return(real_main(argc, argv, envp));
571  *              }
572  *
573  *
574  * Each architecture may also define the style of virtual dirty bit
575  * implementation to be used:
576  *   MPROTECT_VDB: Write protect the heap and catch faults.
577  *   PROC_VDB: Use the SVR4 /proc primitives to read dirty bits.
578  *
579  * An architecture may define DYNAMIC_LOADING if dynamic_load.c
580  * defined GC_register_dynamic_libraries() for the architecture.
581  *
582  * An architecture may define PREFETCH(x) to preload the cache with *x.
583  * This defaults to a no-op.
584  *
585  * PREFETCH_FOR_WRITE(x) is used if *x is about to be written.
586  *
587  * An architecture may also define CLEAR_DOUBLE(x) to be a fast way to
588  * clear the two words at GC_malloc-aligned address x.  By default,
589  * word stores of 0 are used instead.
590  *
591  * HEAP_START may be defined as the initial address hint for mmap-based
592  * allocation.
593  */
594
595 /* If we are using a recent version of gcc, we can use __builtin_unwind_init()
596  * to push the relevant registers onto the stack.  This generally makes
597  * USE_GENERIC_PUSH_REGS the preferred approach for marking from registers.
598  */
599 # if defined(__GNUC__) && ((__GNUC__ >= 3) || \
600                            (__GNUC__ == 2 && __GNUC_MINOR__ >= 8)) \
601                        && !defined(__INTEL_COMPILER)
602 #   define HAVE_BUILTIN_UNWIND_INIT
603 # endif
604
605 # define STACK_GRAN 0x1000000
606 # ifdef M68K
607 #   define MACH_TYPE "M68K"
608 #   define ALIGNMENT 2
609 #   ifdef OPENBSD
610 #       define OS_TYPE "OPENBSD"
611 #       define HEURISTIC2
612 #       ifdef __ELF__
613 #         define DATASTART GC_data_start
614 #         define DYNAMIC_LOADING
615 #       else
616           extern char etext[];
617 #         define DATASTART ((ptr_t)(etext))
618 #       endif
619 #       define USE_GENERIC_PUSH_REGS
620 #   endif
621 #   ifdef NETBSD
622 #       define OS_TYPE "NETBSD"
623 #       define HEURISTIC2
624 #       ifdef __ELF__
625 #         define DATASTART GC_data_start
626 #         define DYNAMIC_LOADING
627 #       else
628           extern char etext[];
629 #         define DATASTART ((ptr_t)(etext))
630 #       endif
631 #       define USE_GENERIC_PUSH_REGS
632 #   endif
633 #   ifdef LINUX
634 #       define OS_TYPE "LINUX"
635 #       define STACKBOTTOM ((ptr_t)0xf0000000)
636 #       define USE_GENERIC_PUSH_REGS
637 #            define USE_MMAP
638               /* We never got around to the assembly version. */
639 /* #       define MPROTECT_VDB - Reported to not work  9/17/01 */
640 #       ifdef __ELF__
641 #            define DYNAMIC_LOADING
642 #            include <features.h>
643 #            if defined(__GLIBC__)&& __GLIBC__>=2
644 #              define SEARCH_FOR_DATA_START
645 #            else /* !GLIBC2 */
646                extern char **__environ;
647 #              define DATASTART ((ptr_t)(&__environ))
648                              /* hideous kludge: __environ is the first */
649                              /* word in crt0.o, and delimits the start */
650                              /* of the data segment, no matter which   */
651                              /* ld options were passed through.        */
652                              /* We could use _etext instead, but that  */
653                              /* would include .rodata, which may       */
654                              /* contain large read-only data tables    */
655                              /* that we'd rather not scan.             */
656 #            endif /* !GLIBC2 */
657              extern int _end[];
658 #            define DATAEND (_end)
659 #       else
660              extern int etext[];
661 #            define DATASTART ((ptr_t)((((word) (etext)) + 0xfff) & ~0xfff))
662 #       endif
663 #   endif
664 #   ifdef SUNOS4
665 #       define OS_TYPE "SUNOS4"
666         extern char etext[];
667 #       define DATASTART ((ptr_t)((((word) (etext)) + 0x1ffff) & ~0x1ffff))
668 #       define HEURISTIC1       /* differs      */
669 #       define DYNAMIC_LOADING
670 #   endif
671 #   ifdef HP
672 #       define OS_TYPE "HP"
673         extern char etext[];
674 #       define DATASTART ((ptr_t)((((word) (etext)) + 0xfff) & ~0xfff))
675 #       define STACKBOTTOM ((ptr_t) 0xffeffffc)
676                               /* empirically determined.  seems to work. */
677 #       include <unistd.h>
678 #       define GETPAGESIZE() sysconf(_SC_PAGE_SIZE)
679 #   endif
680 #   ifdef SYSV
681 #       define OS_TYPE "SYSV"
682         extern etext[];
683 #       define DATASTART ((ptr_t)((((word) (etext)) + 0x3fffff) \
684                                    & ~0x3fffff) \
685                                   +((word)etext & 0x1fff))
686         /* This only works for shared-text binaries with magic number 0413.
687            The other sorts of SysV binaries put the data at the end of the text,
688            in which case the default of etext would work.  Unfortunately,
689            handling both would require having the magic-number available.
690                                 -- Parag
691            */
692 #       define STACKBOTTOM ((ptr_t)0xFFFFFFFE)
693                         /* The stack starts at the top of memory, but   */
694                         /* 0x0 cannot be used as setjump_test complains */
695                         /* that the stack direction is incorrect.  Two  */
696                         /* bytes down from 0x0 should be safe enough.   */
697                         /*              --Parag                         */
698 #       include <sys/mmu.h>
699 #       define GETPAGESIZE() PAGESIZE   /* Is this still right? */
700 #   endif
701 #   ifdef AMIGA
702 #       define OS_TYPE "AMIGA"
703                 /* STACKBOTTOM and DATASTART handled specially  */
704                 /* in os_dep.c                                  */
705 #       define DATAEND  /* not needed */
706 #       define GETPAGESIZE() 4096
707 #   endif
708 #   ifdef MACOS
709 #     ifndef __LOWMEM__
710 #     include <LowMem.h>
711 #     endif
712 #     define OS_TYPE "MACOS"
713                         /* see os_dep.c for details of global data segments. */
714 #     define STACKBOTTOM ((ptr_t) LMGetCurStackBase())
715 #     define DATAEND    /* not needed */
716 #     define GETPAGESIZE() 4096
717 #   endif
718 #   ifdef NEXT
719 #       define OS_TYPE "NEXT"
720 #       define DATASTART ((ptr_t) get_etext())
721 #       define STACKBOTTOM ((ptr_t) 0x4000000)
722 #       define DATAEND  /* not needed */
723 #   endif
724 # endif
725
726 # ifdef POWERPC
727 #   define MACH_TYPE "POWERPC"
728 #   ifdef MACOS
729 #     define ALIGNMENT 2  /* Still necessary?  Could it be 4?   */
730 #     ifndef __LOWMEM__
731 #     include <LowMem.h>
732 #     endif
733 #     define OS_TYPE "MACOS"
734                         /* see os_dep.c for details of global data segments. */
735 #     define STACKBOTTOM ((ptr_t) LMGetCurStackBase())
736 #     define DATAEND  /* not needed */
737 #   endif
738 #   ifdef LINUX
739 #     if (defined (powerpc64) || defined(__powerpc64__))
740 #       define ALIGNMENT 8
741 #       define CPP_WORDSZ 64
742 #     else
743 #       define ALIGNMENT 4
744 #     endif
745 #     define OS_TYPE "LINUX"
746       /* HEURISTIC1 has been reliably reported to fail for a 32-bit     */
747       /* executable on a 64 bit kernel.                                 */
748 #     define LINUX_STACKBOTTOM
749 #     define DYNAMIC_LOADING
750 #     define SEARCH_FOR_DATA_START
751       extern int _end[];
752 #     define DATAEND (_end)
753 #   endif
754 #   ifdef DARWIN
755 #     define ALIGNMENT 4
756 #     define OS_TYPE "DARWIN"
757 #     define DYNAMIC_LOADING
758       /* XXX: see get_end(3), get_etext() and get_end() should not be used.
759          These aren't used when dyld support is enabled (it is by default) */
760 #     define DATASTART ((ptr_t) get_etext())
761 #     define DATAEND    ((ptr_t) get_end())
762 #     define STACKBOTTOM ((ptr_t) 0xc0000000)
763 #     define USE_MMAP
764 #     define USE_MMAP_ANON
765 #     define USE_ASM_PUSH_REGS
766       /* This is potentially buggy. It needs more testing. See the comments in
767          os_dep.c */
768 #     define MPROTECT_VDB
769 #     include <unistd.h>
770 #     define GETPAGESIZE() getpagesize()
771 #     if defined(USE_PPC_PREFETCH) && defined(__GNUC__)
772         /* The performance impact of prefetches is untested */
773 #       define PREFETCH(x) \
774           __asm__ __volatile__ ("dcbt 0,%0" : : "r" ((const void *) (x)))
775 #       define PREFETCH_FOR_WRITE(x) \
776           __asm__ __volatile__ ("dcbtst 0,%0" : : "r" ((const void *) (x)))
777 #     endif
778       /* There seems to be some issues with trylock hanging on darwin. This
779          should be looked into some more */
780 #     define NO_PTHREAD_TRYLOCK
781 #   endif
782 #   ifdef NETBSD
783 #     define ALIGNMENT 4
784 #     define OS_TYPE "NETBSD"
785 #     define HEURISTIC2
786       extern char etext[];
787 #     define DATASTART GC_data_start
788 #     define DYNAMIC_LOADING
789 #   endif
790 #   ifdef NOSYS
791 #     define ALIGNMENT 4
792 #     define OS_TYPE "NOSYS"
793       extern void __end[], __dso_handle[];
794 #     define DATASTART (__dso_handle)  /* OK, that's ugly.  */
795 #     define DATAEND (__end)
796         /* Stack starts at 0xE0000000 for the simulator.  */
797 #     undef STACK_GRAN
798 #     define STACK_GRAN 0x10000000
799 #     define HEURISTIC1
800 #   endif
801 # endif
802
803 # ifdef VAX
804 #   define MACH_TYPE "VAX"
805 #   define ALIGNMENT 4  /* Pointers are longword aligned by 4.2 C compiler */
806     extern char etext[];
807 #   define DATASTART ((ptr_t)(etext))
808 #   ifdef BSD
809 #       define OS_TYPE "BSD"
810 #       define HEURISTIC1
811                         /* HEURISTIC2 may be OK, but it's hard to test. */
812 #   endif
813 #   ifdef ULTRIX
814 #       define OS_TYPE "ULTRIX"
815 #       define STACKBOTTOM ((ptr_t) 0x7fffc800)
816 #   endif
817 # endif
818
819 # ifdef RT
820 #   define MACH_TYPE "RT"
821 #   define ALIGNMENT 4
822 #   define DATASTART ((ptr_t) 0x10000000)
823 #   define STACKBOTTOM ((ptr_t) 0x1fffd800)
824 # endif
825
826 # ifdef SPARC
827 #   define MACH_TYPE "SPARC"
828 #   if defined(__arch64__) || defined(__sparcv9)
829 #     define ALIGNMENT 8
830 #     define CPP_WORDSZ 64
831 #     define ELF_CLASS ELFCLASS64
832 #   else
833 #     define ALIGNMENT 4        /* Required by hardware */
834 #     define CPP_WORDSZ 32
835 #   endif
836 #   define ALIGN_DOUBLE
837 #   ifdef SUNOS5
838 #       define OS_TYPE "SUNOS5"
839         extern int _etext[];
840         extern int _end[];
841         extern ptr_t GC_SysVGetDataStart();
842 #       define DATASTART GC_SysVGetDataStart(0x10000, _etext)
843 #       define DATAEND (_end)
844 #       if !defined(USE_MMAP) && defined(REDIRECT_MALLOC)
845 #           define USE_MMAP
846             /* Otherwise we now use calloc.  Mmap may result in the     */
847             /* heap interleaved with thread stacks, which can result in */
848             /* excessive blacklisting.  Sbrk is unusable since it       */
849             /* doesn't interact correctly with the system malloc.       */
850 #       endif
851 #       ifdef USE_MMAP
852 #         define HEAP_START (ptr_t)0x40000000
853 #       else
854 #         define HEAP_START DATAEND
855 #       endif
856 #       define PROC_VDB
857 /*      HEURISTIC1 reportedly no longer works under 2.7.                */
858 /*      HEURISTIC2 probably works, but this appears to be preferable.   */
859 /*      Apparently USRSTACK is defined to be USERLIMIT, but in some     */
860 /*      installations that's undefined.  We work around this with a     */
861 /*      gross hack:                                                     */
862 #       include <sys/vmparam.h>
863 #       ifdef USERLIMIT
864           /* This should work everywhere, but doesn't.  */
865 #         define STACKBOTTOM USRSTACK
866 #       else
867 #         define HEURISTIC2
868 #       endif
869 #       include <unistd.h>
870 #       define GETPAGESIZE()  sysconf(_SC_PAGESIZE)
871                 /* getpagesize() appeared to be missing from at least one */
872                 /* Solaris 5.4 installation.  Weird.                      */
873 #       define DYNAMIC_LOADING
874 #   endif
875 #   ifdef SUNOS4
876 #       define OS_TYPE "SUNOS4"
877         /* [If you have a weak stomach, don't read this.]               */
878         /* We would like to use:                                        */
879 /* #       define DATASTART ((ptr_t)((((word) (etext)) + 0x1fff) & ~0x1fff)) */
880         /* This fails occasionally, due to an ancient, but very         */
881         /* persistent ld bug.  etext is set 32 bytes too high.          */
882         /* We instead read the text segment size from the a.out         */
883         /* header, which happens to be mapped into our address space    */
884         /* at the start of the text segment.  The detective work here   */
885         /* was done by Robert Ehrlich, Manuel Serrano, and Bernard      */
886         /* Serpette of INRIA.                                           */
887         /* This assumes ZMAGIC, i.e. demand-loadable executables.       */
888 #       define TEXTSTART 0x2000
889 #       define DATASTART ((ptr_t)(*(int *)(TEXTSTART+0x4)+TEXTSTART))
890 #       define MPROTECT_VDB
891 #       define HEURISTIC1
892 #       define DYNAMIC_LOADING
893 #   endif
894 #   ifdef DRSNX
895 #       define OS_TYPE "DRSNX"
896         extern ptr_t GC_SysVGetDataStart();
897         extern int etext[];
898 #       define DATASTART GC_SysVGetDataStart(0x10000, etext)
899 #       define MPROTECT_VDB
900 #       define STACKBOTTOM ((ptr_t) 0xdfff0000)
901 #       define DYNAMIC_LOADING
902 #   endif
903 #   ifdef LINUX
904 #     define OS_TYPE "LINUX"
905 #     ifdef __ELF__
906 #       define DYNAMIC_LOADING
907 #     else
908           Linux Sparc/a.out not supported
909 #     endif
910       extern int _end[];
911       extern int _etext[];
912 #     define DATAEND (_end)
913 #     define SVR4
914       extern ptr_t GC_SysVGetDataStart();
915 #     ifdef __arch64__
916 #       define DATASTART GC_SysVGetDataStart(0x100000, _etext)
917         /* libc_stack_end is not set reliably for sparc64 */
918 #       define STACKBOTTOM ((ptr_t) 0x80000000000ULL)
919 #     else
920 #       define DATASTART GC_SysVGetDataStart(0x10000, _etext)
921 #       define LINUX_STACKBOTTOM
922 #     endif
923 #   endif
924 #   ifdef OPENBSD
925 #     define OS_TYPE "OPENBSD"
926 #     define STACKBOTTOM ((ptr_t) 0xf8000000)
927       extern int etext[];
928 #     define DATASTART ((ptr_t)(etext))
929 #   endif
930 #   ifdef NETBSD
931 #     define OS_TYPE "NETBSD"
932 #     define HEURISTIC2
933 #     ifdef __ELF__
934 #       define DATASTART GC_data_start
935 #       define DYNAMIC_LOADING
936 #     else
937         extern char etext[];
938 #       define DATASTART ((ptr_t)(etext))
939 #     endif
940 #   endif
941 # endif
942
943 # ifdef I386
944 #   define MACH_TYPE "I386"
945 #   if defined(__LP64__) || defined(_WIN64)
946 #     define CPP_WORDSZ 64
947 #     define ALIGNMENT 8
948 #   else
949 #     define CPP_WORDSZ 32
950 #     define ALIGNMENT 4
951                         /* Appears to hold for all "32 bit" compilers   */
952                         /* except Borland.  The -a4 option fixes        */
953                         /* Borland.                                     */
954                         /* Ivan Demakov: For Watcom the option is -zp4. */
955 #   endif
956 #   ifndef SMALL_CONFIG
957 #     define ALIGN_DOUBLE /* Not strictly necessary, but may give speed   */
958                           /* improvement on Pentiums.                     */
959 #   endif
960 #   ifdef HAVE_BUILTIN_UNWIND_INIT
961 #       define USE_GENERIC_PUSH_REGS
962 #   endif
963 #   ifdef SEQUENT
964 #       define OS_TYPE "SEQUENT"
965         extern int etext[];
966 #       define DATASTART ((ptr_t)((((word) (etext)) + 0xfff) & ~0xfff))
967 #       define STACKBOTTOM ((ptr_t) 0x3ffff000) 
968 #   endif
969 #   ifdef BEOS
970 #     define OS_TYPE "BEOS"
971 #     include <OS.h>
972 #     define GETPAGESIZE() B_PAGE_SIZE
973       extern int etext[];
974 #     define DATASTART ((ptr_t)((((word) (etext)) + 0xfff) & ~0xfff))
975 #   endif
976 #   ifdef SUNOS5
977 #       define OS_TYPE "SUNOS5"
978         extern int _etext[], _end[];
979         extern ptr_t GC_SysVGetDataStart();
980 #       define DATASTART GC_SysVGetDataStart(0x1000, _etext)
981 #       define DATAEND (_end)
982 /*      # define STACKBOTTOM ((ptr_t)(_start)) worked through 2.7,      */
983 /*      but reportedly breaks under 2.8.  It appears that the stack     */
984 /*      base is a property of the executable, so this should not break  */
985 /*      old executables.                                                */
986 /*      HEURISTIC2 probably works, but this appears to be preferable.   */
987 #       include <sys/vm.h>
988 #       define STACKBOTTOM USRSTACK
989 /* At least in Solaris 2.5, PROC_VDB gives wrong values for dirty bits. */
990 /* It appears to be fixed in 2.8 and 2.9.                               */
991 #       ifdef SOLARIS25_PROC_VDB_BUG_FIXED
992 #         define PROC_VDB
993 #       endif
994 #       define DYNAMIC_LOADING
995 #       if !defined(USE_MMAP) && defined(REDIRECT_MALLOC)
996 #           define USE_MMAP
997             /* Otherwise we now use calloc.  Mmap may result in the     */
998             /* heap interleaved with thread stacks, which can result in */
999             /* excessive blacklisting.  Sbrk is unusable since it       */
1000             /* doesn't interact correctly with the system malloc.       */
1001 #       endif
1002 #       ifdef USE_MMAP
1003 #         define HEAP_START (ptr_t)0x40000000
1004 #       else
1005 #         define HEAP_START DATAEND
1006 #       endif
1007 #   endif
1008 #   ifdef SCO
1009 #       define OS_TYPE "SCO"
1010         extern int etext[];
1011 #       define DATASTART ((ptr_t)((((word) (etext)) + 0x3fffff) \
1012                                   & ~0x3fffff) \
1013                                  +((word)etext & 0xfff))
1014 #       define STACKBOTTOM ((ptr_t) 0x7ffffffc)
1015 #   endif
1016 #   ifdef SCO_ELF
1017 #       define OS_TYPE "SCO_ELF"
1018         extern int etext[];
1019 #       define DATASTART ((ptr_t)(etext))
1020 #       define STACKBOTTOM ((ptr_t) 0x08048000)
1021 #       define DYNAMIC_LOADING
1022 #       define ELF_CLASS ELFCLASS32
1023 #   endif
1024 #   ifdef DGUX
1025 #       define OS_TYPE "DGUX"
1026         extern int _etext, _end;
1027         extern ptr_t GC_SysVGetDataStart();
1028 #       define DATASTART GC_SysVGetDataStart(0x1000, &_etext)
1029 #       define DATAEND (&_end)
1030 #       define STACK_GROWS_DOWN
1031 #       define HEURISTIC2
1032 #       include <unistd.h>
1033 #       define GETPAGESIZE()  sysconf(_SC_PAGESIZE)
1034 #       define DYNAMIC_LOADING
1035 #       ifndef USE_MMAP
1036 #         define USE_MMAP
1037 #       endif /* USE_MMAP */
1038 #       define MAP_FAILED (void *) -1
1039 #       ifdef USE_MMAP
1040 #         define HEAP_START (ptr_t)0x40000000
1041 #       else /* USE_MMAP */
1042 #         define HEAP_START DATAEND
1043 #       endif /* USE_MMAP */
1044 #   endif /* DGUX */
1045
1046 #   ifdef LINUX
1047 #       ifndef __GNUC__
1048           /* The Intel compiler doesn't like inline assembly */
1049 #         define USE_GENERIC_PUSH_REGS
1050 #       endif
1051 #       define OS_TYPE "LINUX"
1052 #       define LINUX_STACKBOTTOM
1053 #       if 0
1054 #         define HEURISTIC1
1055 #         undef STACK_GRAN
1056 #         define STACK_GRAN 0x10000000
1057           /* STACKBOTTOM is usually 0xc0000000, but this changes with   */
1058           /* different kernel configurations.  In particular, systems   */
1059           /* with 2GB physical memory will usually move the user        */
1060           /* address space limit, and hence initial SP to 0x80000000.   */
1061 #       endif
1062 #       if !defined(GC_LINUX_THREADS) || !defined(REDIRECT_MALLOC)
1063 #           define MPROTECT_VDB
1064 #       else
1065             /* We seem to get random errors in incremental mode,        */
1066             /* possibly because Linux threads is itself a malloc client */
1067             /* and can't deal with the signals.                         */
1068 #       endif
1069 #       define HEAP_START (ptr_t)0x1000
1070                 /* This encourages mmap to give us low addresses,       */
1071                 /* thus allowing the heap to grow to ~3GB               */
1072 #       ifdef __ELF__
1073 #            define DYNAMIC_LOADING
1074 #            ifdef UNDEFINED    /* includes ro data */
1075                extern int _etext[];
1076 #              define DATASTART ((ptr_t)((((word) (_etext)) + 0xfff) & ~0xfff))
1077 #            endif
1078 #            include <features.h>
1079 #            if defined(__GLIBC__) && __GLIBC__ >= 2
1080 #                define SEARCH_FOR_DATA_START
1081 #            else
1082                  extern char **__environ;
1083 #                define DATASTART ((ptr_t)(&__environ))
1084                               /* hideous kludge: __environ is the first */
1085                               /* word in crt0.o, and delimits the start */
1086                               /* of the data segment, no matter which   */
1087                               /* ld options were passed through.        */
1088                               /* We could use _etext instead, but that  */
1089                               /* would include .rodata, which may       */
1090                               /* contain large read-only data tables    */
1091                               /* that we'd rather not scan.             */
1092 #            endif
1093              extern int _end[];
1094 #            define DATAEND (_end)
1095 #       else
1096              extern int etext[];
1097 #            define DATASTART ((ptr_t)((((word) (etext)) + 0xfff) & ~0xfff))
1098 #       endif
1099 #       ifdef USE_I686_PREFETCH
1100           /* FIXME: Thus should use __builtin_prefetch, but we'll leave that    */
1101           /* for the next rtelease.                                             */
1102 #         define PREFETCH(x) \
1103             __asm__ __volatile__ ("     prefetchnta     %0": : "m"(*(char *)(x)))
1104             /* Empirically prefetcht0 is much more effective at reducing        */
1105             /* cache miss stalls for the targetted load instructions.  But it   */
1106             /* seems to interfere enough with other cache traffic that the net  */
1107             /* result is worse than prefetchnta.                                */
1108 #         if 0 
1109             /* Using prefetches for write seems to have a slight negative       */
1110             /* impact on performance, at least for a PIII/500.                  */
1111 #           define PREFETCH_FOR_WRITE(x) \
1112               __asm__ __volatile__ ("   prefetcht0      %0": : "m"(*(char *)(x)))
1113 #         endif
1114 #       endif
1115 #       ifdef USE_3DNOW_PREFETCH
1116 #         define PREFETCH(x) \
1117             __asm__ __volatile__ ("     prefetch        %0": : "m"(*(char *)(x)))
1118 #         define PREFETCH_FOR_WRITE(x) \
1119             __asm__ __volatile__ ("     prefetchw       %0": : "m"(*(char *)(x)))
1120 #       endif
1121 #   endif
1122 #   ifdef CYGWIN32
1123 #       define OS_TYPE "CYGWIN32"
1124           extern int _data_start__[];
1125           extern int _data_end__[];
1126           extern int _bss_start__[];
1127           extern int _bss_end__[];
1128         /* For binutils 2.9.1, we have                  */
1129         /*      DATASTART   = _data_start__             */
1130         /*      DATAEND     = _bss_end__                */
1131         /* whereas for some earlier versions it was     */
1132         /*      DATASTART   = _bss_start__              */
1133         /*      DATAEND     = _data_end__               */
1134         /* To get it right for both, we take the        */
1135         /* minumum/maximum of the two.                  */
1136 #     ifndef MAX
1137 #       define MAX(x,y) ((x) > (y) ? (x) : (y))
1138 #     endif
1139 #     ifndef MIN
1140 #       define MIN(x,y) ((x) < (y) ? (x) : (y))
1141 #     endif
1142 #       define DATASTART ((ptr_t) MIN(_data_start__, _bss_start__))
1143 #       define DATAEND   ((ptr_t) MAX(_data_end__, _bss_end__))
1144 #       undef STACK_GRAN
1145 #       define STACK_GRAN 0x10000
1146 #       define HEURISTIC1
1147 #   endif
1148 #   ifdef OS2
1149 #       define OS_TYPE "OS2"
1150                 /* STACKBOTTOM and DATASTART are handled specially in   */
1151                 /* os_dep.c. OS2 actually has the right                 */
1152                 /* system call!                                         */
1153 #       define DATAEND  /* not needed */
1154 #       define USE_GENERIC_PUSH_REGS
1155 #   endif
1156 #   ifdef MSWIN32
1157 #       define OS_TYPE "MSWIN32"
1158                 /* STACKBOTTOM and DATASTART are handled specially in   */
1159                 /* os_dep.c.                                            */
1160 #       ifndef __WATCOMC__
1161 #         define MPROTECT_VDB
1162 #       endif
1163 #       define DATAEND  /* not needed */
1164 #   endif
1165 #   ifdef MSWINCE
1166 #       define OS_TYPE "MSWINCE"
1167 #       define DATAEND  /* not needed */
1168 #   endif
1169 #   ifdef DJGPP
1170 #       define OS_TYPE "DJGPP"
1171 #       include "stubinfo.h"
1172         extern int etext[];
1173         extern int _stklen;
1174         extern int __djgpp_stack_limit;
1175 #       define DATASTART ((ptr_t)((((word) (etext)) + 0x1ff) & ~0x1ff))
1176 /* #       define STACKBOTTOM ((ptr_t)((word) _stubinfo + _stubinfo->size \
1177                                                      + _stklen)) */
1178 #       define STACKBOTTOM ((ptr_t)((word) __djgpp_stack_limit + _stklen))
1179                 /* This may not be right.  */
1180 #   endif
1181 #   ifdef OPENBSD
1182 #       define OS_TYPE "OPENBSD"
1183 #   endif
1184 #   ifdef FREEBSD
1185 #       define OS_TYPE "FREEBSD"
1186 #       ifndef GC_FREEBSD_THREADS
1187 #           define MPROTECT_VDB
1188 #       endif
1189 #       define SIG_SUSPEND SIGUSR1
1190 #       define SIG_THR_RESTART SIGUSR2
1191 #       define FREEBSD_STACKBOTTOM
1192 #       ifdef __ELF__
1193 #           define DYNAMIC_LOADING
1194 #       endif
1195         extern char etext[];
1196         extern char * GC_FreeBSDGetDataStart();
1197 #       define DATASTART GC_FreeBSDGetDataStart(0x1000, &etext)
1198 #   endif
1199 #   ifdef NETBSD
1200 #       define OS_TYPE "NETBSD"
1201 #       ifdef __ELF__
1202 #           define DYNAMIC_LOADING
1203 #       endif
1204 #   endif
1205 #   ifdef THREE86BSD
1206 #       define OS_TYPE "THREE86BSD"
1207 #   endif
1208 #   ifdef BSDI
1209 #       define OS_TYPE "BSDI"
1210 #   endif
1211 #   if defined(OPENBSD) || defined(NETBSD) \
1212         || defined(THREE86BSD) || defined(BSDI)
1213 #       define HEURISTIC2
1214         extern char etext[];
1215 #       define DATASTART ((ptr_t)(etext))
1216 #   endif
1217 #   ifdef NEXT
1218 #       define OS_TYPE "NEXT"
1219 #       define DATASTART ((ptr_t) get_etext())
1220 #       define STACKBOTTOM ((ptr_t)0xc0000000)
1221 #       define DATAEND  /* not needed */
1222 #   endif
1223 #   ifdef DOS4GW
1224 #     define OS_TYPE "DOS4GW"
1225       extern long __nullarea;
1226       extern char _end;
1227       extern char *_STACKTOP;
1228       /* Depending on calling conventions Watcom C either precedes
1229          or does not precedes with undescore names of C-variables.
1230          Make sure startup code variables always have the same names.  */
1231       #pragma aux __nullarea "*";
1232       #pragma aux _end "*";
1233 #     define STACKBOTTOM ((ptr_t) _STACKTOP)
1234                          /* confused? me too. */
1235 #     define DATASTART ((ptr_t) &__nullarea)
1236 #     define DATAEND ((ptr_t) &_end)
1237 #   endif
1238 #   ifdef HURD
1239 #     define OS_TYPE "HURD"
1240 #     define STACK_GROWS_DOWN
1241 #     define HEURISTIC2
1242       extern int  __data_start[];
1243 #     define DATASTART ( (ptr_t) (__data_start))
1244       extern int   _end[];
1245 #     define DATAEND ( (ptr_t) (_end))
1246 /* #     define MPROTECT_VDB  Not quite working yet? */
1247 #     define DYNAMIC_LOADING
1248 #   endif
1249 # endif
1250
1251 # ifdef NS32K
1252 #   define MACH_TYPE "NS32K"
1253 #   define ALIGNMENT 4
1254     extern char **environ;
1255 #   define DATASTART ((ptr_t)(&environ))
1256                               /* hideous kludge: environ is the first   */
1257                               /* word in crt0.o, and delimits the start */
1258                               /* of the data segment, no matter which   */
1259                               /* ld options were passed through.        */
1260 #   define STACKBOTTOM ((ptr_t) 0xfffff000) /* for Encore */
1261 # endif
1262
1263 # ifdef MIPS
1264 #   define MACH_TYPE "MIPS"
1265 #   ifdef LINUX
1266       /* This was developed for a linuxce style platform.  Probably     */
1267       /* needs to be tweaked for workstation class machines.            */
1268 #     define OS_TYPE "LINUX"
1269 #     define DYNAMIC_LOADING
1270       extern int _end[];
1271 #     define DATAEND (_end)
1272       extern int __data_start[];
1273 #     define DATASTART ((ptr_t)(__data_start))
1274 #     define ALIGNMENT 4
1275 #     define USE_GENERIC_PUSH_REGS
1276 #     if __GLIBC__ == 2 && __GLIBC_MINOR__ >= 2 || __GLIBC__ > 2
1277 #        define LINUX_STACKBOTTOM
1278 #     else
1279 #        define STACKBOTTOM 0x80000000
1280 #     endif
1281 #   endif /* Linux */
1282 #   ifdef EWS4800
1283 #      define HEURISTIC2
1284 #      if defined(_MIPS_SZPTR) && (_MIPS_SZPTR == 64)
1285          extern int _fdata[], _end[];
1286 #        define DATASTART ((ptr_t)_fdata)
1287 #        define DATAEND ((ptr_t)_end)
1288 #        define CPP_WORDSZ _MIPS_SZPTR
1289 #        define ALIGNMENT (_MIPS_SZPTR/8)
1290 #      else
1291          extern int etext[], edata[], end[];
1292          extern int _DYNAMIC_LINKING[], _gp[];
1293 #        define DATASTART ((ptr_t)((((word)etext + 0x3ffff) & ~0x3ffff) \
1294                + ((word)etext & 0xffff)))
1295 #        define DATAEND (edata)
1296 #        define DATASTART2 (_DYNAMIC_LINKING \
1297                ? (ptr_t)(((word)_gp + 0x8000 + 0x3ffff) & ~0x3ffff) \
1298                : (ptr_t)edata)
1299 #        define DATAEND2 (end)
1300 #        define ALIGNMENT 4
1301 #      endif
1302 #      define OS_TYPE "EWS4800"
1303 #      define USE_GENERIC_PUSH_REGS 1
1304 #   endif
1305 #   ifdef ULTRIX
1306 #       define HEURISTIC2
1307 #       define DATASTART (ptr_t)0x10000000
1308                               /* Could probably be slightly higher since */
1309                               /* startup code allocates lots of stuff.   */
1310 #       define OS_TYPE "ULTRIX"
1311 #       define ALIGNMENT 4
1312 #   endif
1313 #   ifdef RISCOS
1314 #       define HEURISTIC2
1315 #       define DATASTART (ptr_t)0x10000000
1316 #       define OS_TYPE "RISCOS"
1317 #       define ALIGNMENT 4  /* Required by hardware */
1318 #   endif
1319 #   ifdef IRIX5
1320 #       define HEURISTIC2
1321         extern int _fdata[];
1322 #       define DATASTART ((ptr_t)(_fdata))
1323 #       ifdef USE_MMAP
1324 #         define HEAP_START (ptr_t)0x30000000
1325 #       else
1326 #         define HEAP_START DATASTART
1327 #       endif
1328                               /* Lowest plausible heap address.         */
1329                               /* In the MMAP case, we map there.        */
1330                               /* In either case it is used to identify  */
1331                               /* heap sections so they're not           */
1332                               /* considered as roots.                   */
1333 #       define OS_TYPE "IRIX5"
1334 /*#       define MPROTECT_VDB DOB: this should work, but there is evidence */
1335 /*              of recent breakage.                                        */
1336 #       ifdef _MIPS_SZPTR
1337 #         define CPP_WORDSZ _MIPS_SZPTR
1338 #         define ALIGNMENT (_MIPS_SZPTR/8)
1339 #         if CPP_WORDSZ != 64
1340 #           define ALIGN_DOUBLE
1341 #         endif
1342 #       else
1343 #         define ALIGNMENT 4
1344 #         define ALIGN_DOUBLE
1345 #       endif
1346 #       define DYNAMIC_LOADING
1347 #   endif
1348 #   ifdef MSWINCE
1349 #       define OS_TYPE "MSWINCE"
1350 #       define ALIGNMENT 4
1351 #       define DATAEND /* not needed */
1352 #   endif
1353 #   if defined(NETBSD)
1354 #     define OS_TYPE "NETBSD"
1355 #     define ALIGNMENT 4
1356 #     define HEURISTIC2
1357 #     define USE_GENERIC_PUSH_REGS
1358 #     ifdef __ELF__
1359         extern int etext[];
1360 #       define DATASTART GC_data_start
1361 #       define NEED_FIND_LIMIT
1362 #       define DYNAMIC_LOADING
1363 #     else
1364 #       define DATASTART ((ptr_t) 0x10000000)
1365 #       define STACKBOTTOM ((ptr_t) 0x7ffff000)
1366 #     endif /* _ELF_ */
1367 #  endif
1368 # endif
1369
1370 # ifdef RS6000
1371 #   define MACH_TYPE "RS6000"
1372 #   ifdef ALIGNMENT
1373 #     undef ALIGNMENT
1374 #   endif
1375 #   ifdef IA64
1376 #     undef IA64 /* DOB: some AIX installs stupidly define IA64 in /usr/include/sys/systemcfg.h */
1377 #   endif
1378 #   ifdef __64BIT__
1379 #     define ALIGNMENT 8
1380 #     define CPP_WORDSZ 64
1381 #     define STACKBOTTOM ((ptr_t)0x1000000000000000)
1382 #   else
1383 #     define ALIGNMENT 4
1384 #     define CPP_WORDSZ 32
1385 #     define STACKBOTTOM ((ptr_t)((ulong)&errno))
1386 #   endif
1387  /* From AIX linker man page:
1388  _text Specifies the first location of the program.
1389  _etext Specifies the first location after the program.
1390  _data Specifies the first location of the data.
1391  _edata Specifies the first location after the initialized data
1392  _end or end Specifies the first location after all data.
1393  */
1394     extern int _data[], _end[];
1395 #   define DATASTART ((ptr_t)((ulong)_data))
1396 #   define DATAEND ((ptr_t)((ulong)_end))
1397     extern int errno;
1398 #   define USE_GENERIC_PUSH_REGS
1399 #   define DYNAMIC_LOADING
1400         /* For really old versions of AIX, this may have to be removed. */
1401 # endif
1402
1403 # ifdef HP_PA
1404 #   define MACH_TYPE "HP_PA"
1405 #   ifdef __LP64__
1406 #     define CPP_WORDSZ 64
1407 #     define ALIGNMENT 8
1408 #   else
1409 #     define CPP_WORDSZ 32
1410 #     define ALIGNMENT 4
1411 #     define ALIGN_DOUBLE
1412 #   endif
1413 #   if !defined(GC_HPUX_THREADS) && !defined(GC_LINUX_THREADS)
1414 #     ifndef LINUX /* For now. */
1415 #       define MPROTECT_VDB
1416 #     endif
1417 #   else
1418 #     define GENERIC_COMPARE_AND_SWAP
1419         /* No compare-and-swap instruction.  Use pthread mutexes        */
1420         /* when we absolutely have to.                                  */
1421 #     ifdef PARALLEL_MARK
1422 #       define USE_MARK_BYTES
1423                 /* Minimize compare-and-swap usage.             */
1424 #     endif
1425 #   endif
1426 #   define STACK_GROWS_UP
1427 #   ifdef HPUX
1428 #     define OS_TYPE "HPUX"
1429       extern int __data_start[];
1430 #     define DATASTART ((ptr_t)(__data_start))
1431 #     if 0
1432         /* The following appears to work for 7xx systems running HP/UX  */
1433         /* 9.xx Furthermore, it might result in much faster             */
1434         /* collections than HEURISTIC2, which may involve scanning      */
1435         /* segments that directly precede the stack.  It is not the     */
1436         /* default, since it may not work on older machine/OS           */
1437         /* combinations. (Thanks to Raymond X.T. Nijssen for uncovering */
1438         /* this.)                                                       */
1439 #       define STACKBOTTOM ((ptr_t) 0x7b033000)  /* from /etc/conf/h/param.h */
1440 #     else
1441         /* Gustavo Rodriguez-Rivera suggested changing HEURISTIC2       */
1442         /* to this.  Note that the GC must be initialized before the    */
1443         /* first putenv call.                                           */
1444         extern char ** environ;
1445 #       define STACKBOTTOM ((ptr_t)environ)
1446 #     endif
1447 #     define DYNAMIC_LOADING
1448 #     include <unistd.h>
1449 #     define GETPAGESIZE() sysconf(_SC_PAGE_SIZE)
1450 #     ifndef __GNUC__
1451 #       define PREFETCH(x)  { \
1452                               register long addr = (long)(x); \
1453                               (void) _asm ("LDW", 0, 0, addr, 0); \
1454                             }
1455 #     endif
1456 #   endif /* HPUX */
1457 #   ifdef LINUX
1458 #     define OS_TYPE "LINUX"
1459 #     define LINUX_STACKBOTTOM
1460 #     define DYNAMIC_LOADING
1461 #     define SEARCH_FOR_DATA_START
1462       extern int _end[];
1463 #     define DATAEND (&_end)
1464 #   endif /* LINUX */
1465 # endif /* HP_PA */
1466
1467 # ifdef ALPHA
1468 #   define MACH_TYPE "ALPHA"
1469 #   define ALIGNMENT 8
1470 #   define CPP_WORDSZ 64
1471 #   ifndef LINUX
1472 #     define USE_GENERIC_PUSH_REGS
1473       /* Gcc and probably the DEC/Compaq compiler spill pointers to preserved */
1474       /* fp registers in some cases when the target is a 21264.  The assembly */
1475       /* code doesn't handle that yet, and version dependencies make that a   */
1476       /* bit tricky.  Do the easy thing for now.                                    */
1477 #   endif
1478 #   ifdef NETBSD
1479 #       define OS_TYPE "NETBSD"
1480 #       define HEURISTIC2
1481 #       define DATASTART GC_data_start
1482 #       define ELFCLASS32 32
1483 #       define ELFCLASS64 64
1484 #       define ELF_CLASS ELFCLASS64
1485 #       define DYNAMIC_LOADING
1486 #   endif
1487 #   ifdef OPENBSD
1488 #       define OS_TYPE "OPENBSD"
1489 #       define HEURISTIC2
1490 #       ifdef __ELF__   /* since OpenBSD/Alpha 2.9 */
1491 #          define DATASTART GC_data_start
1492 #          define ELFCLASS32 32
1493 #          define ELFCLASS64 64
1494 #          define ELF_CLASS ELFCLASS64
1495 #       else            /* ECOFF, until OpenBSD/Alpha 2.7 */
1496 #          define DATASTART ((ptr_t) 0x140000000)
1497 #       endif
1498 #   endif
1499 #   ifdef FREEBSD
1500 #       define OS_TYPE "FREEBSD"
1501 /* MPROTECT_VDB is not yet supported at all on FreeBSD/alpha. */
1502 #       define SIG_SUSPEND SIGUSR1
1503 #       define SIG_THR_RESTART SIGUSR2
1504 #       define FREEBSD_STACKBOTTOM
1505 #       ifdef __ELF__
1506 #           define DYNAMIC_LOADING
1507 #       endif
1508 /* Handle unmapped hole alpha*-*-freebsd[45]* puts between etext and edata. */
1509         extern char etext[];
1510         extern char edata[];
1511         extern char end[];
1512 #       define NEED_FIND_LIMIT
1513 #       define DATASTART ((ptr_t)(&etext))
1514 #       define DATAEND (GC_find_limit (DATASTART, TRUE))
1515 #       define DATASTART2 ((ptr_t)(&edata))
1516 #       define DATAEND2 ((ptr_t)(&end))
1517 #   endif
1518 #   ifdef OSF1
1519 #       define OS_TYPE "OSF1"
1520 #       define DATASTART ((ptr_t) 0x140000000)
1521         extern int _end[];
1522 #       define DATAEND ((ptr_t) &_end)
1523         extern char ** environ;
1524         /* round up from the value of environ to the nearest page boundary */
1525         /* Probably breaks if putenv is called before collector            */
1526         /* initialization.                                                 */
1527 #       define STACKBOTTOM ((ptr_t)(((word)(environ) | (getpagesize()-1))+1))
1528 /* #    define HEURISTIC2 */
1529         /* Normally HEURISTIC2 is too conervative, since                */
1530         /* the text segment immediately follows the stack.              */
1531         /* Hence we give an upper pound.                                */
1532         /* This is currently unused, since we disabled HEURISTIC2       */
1533         extern int __start[];
1534 #       define HEURISTIC2_LIMIT ((ptr_t)((word)(__start) & ~(getpagesize()-1)))
1535 #       ifndef GC_OSF1_THREADS
1536           /* Unresolved signal issues with threads.     */
1537 #         define MPROTECT_VDB
1538 #       endif
1539 #       define DYNAMIC_LOADING
1540 #   endif
1541 #   ifdef LINUX
1542 #       define OS_TYPE "LINUX"
1543 #       define STACKBOTTOM ((ptr_t) 0x120000000)
1544 #       ifdef __ELF__
1545 #         define SEARCH_FOR_DATA_START
1546 #         define DYNAMIC_LOADING
1547 #       else
1548 #           define DATASTART ((ptr_t) 0x140000000)
1549 #       endif
1550         extern int _end[];
1551 #       define DATAEND (_end)
1552 #       define MPROTECT_VDB
1553                 /* Has only been superficially tested.  May not */
1554                 /* work on all versions.                        */
1555 #   endif
1556 # endif
1557
1558 # ifdef IA64
1559 #   define MACH_TYPE "IA64"
1560 #   define USE_GENERIC_PUSH_REGS
1561         /* We need to get preserved registers in addition to register   */
1562         /* windows.   That's easiest to do with setjmp.                 */
1563 #   ifdef PARALLEL_MARK
1564 #       define USE_MARK_BYTES
1565             /* Compare-and-exchange is too expensive to use for         */
1566             /* setting mark bits.                                       */
1567 #   endif
1568 #   ifdef HPUX
1569 #       ifdef _ILP32
1570 #         define CPP_WORDSZ 32
1571 #         define ALIGN_DOUBLE
1572             /* Requires 8 byte alignment for malloc */
1573 #         define ALIGNMENT 4
1574 #       else
1575 #         ifndef _LP64
1576                 ---> unknown ABI
1577 #         endif
1578 #         define CPP_WORDSZ 64
1579 #         define ALIGN_DOUBLE
1580             /* Requires 16 byte alignment for malloc */
1581 #         define ALIGNMENT 8
1582 #       endif
1583 #       define OS_TYPE "HPUX"   
1584         extern int __data_start[];
1585 #       define DATASTART ((ptr_t)(__data_start))
1586         /* Gustavo Rodriguez-Rivera suggested changing HEURISTIC2       */
1587         /* to this.  Note that the GC must be initialized before the    */
1588         /* first putenv call.                                           */
1589         extern char ** environ;
1590 #       define STACKBOTTOM ((ptr_t)environ)
1591 #       define HPUX_STACKBOTTOM
1592 #       define DYNAMIC_LOADING
1593 #       include <unistd.h>
1594 #       define GETPAGESIZE() sysconf(_SC_PAGE_SIZE)
1595         /* The following was empirically determined, and is probably    */
1596         /* not very robust.                                             */
1597         /* Note that the backing store base seems to be at a nice       */
1598         /* address minus one page.                                      */
1599 #       define BACKING_STORE_DISPLACEMENT 0x1000000
1600 #       define BACKING_STORE_ALIGNMENT 0x1000
1601         extern ptr_t GC_register_stackbottom;
1602 #       define BACKING_STORE_BASE GC_register_stackbottom
1603         /* Known to be wrong for recent HP/UX versions!!!       */
1604 #   endif
1605 #   ifdef LINUX
1606 #       define CPP_WORDSZ 64
1607 #       define ALIGN_DOUBLE
1608           /* Requires 16 byte alignment for malloc */
1609 #       define ALIGNMENT 8
1610 #       define OS_TYPE "LINUX"
1611         /* The following works on NUE and older kernels:        */
1612 /* #       define STACKBOTTOM ((ptr_t) 0xa000000000000000l)     */
1613         /* This does not work on NUE:                           */
1614 #       define LINUX_STACKBOTTOM
1615         /* We also need the base address of the register stack  */
1616         /* backing store.  This is computed in                  */
1617         /* GC_linux_register_stack_base based on the following  */
1618         /* constants:                                           */
1619 #       define BACKING_STORE_ALIGNMENT 0x100000
1620 #       define BACKING_STORE_DISPLACEMENT 0x80000000
1621         extern ptr_t GC_register_stackbottom;
1622 #       define BACKING_STORE_BASE GC_register_stackbottom
1623 #       define SEARCH_FOR_DATA_START
1624 #       ifdef __GNUC__
1625 #         define DYNAMIC_LOADING
1626 #       else
1627           /* In the Intel compiler environment, we seem to end up with  */
1628           /* statically linked executables and an undefined reference   */
1629           /* to _DYNAMIC                                                */
1630 #       endif
1631 #       define MPROTECT_VDB
1632                 /* Requires Linux 2.3.47 or later.      */
1633         extern int _end[];
1634 #       define DATAEND (_end)
1635 #       ifdef __GNUC__
1636 #         ifndef __INTEL_COMPILER
1637 #           define PREFETCH(x) \
1638               __asm__ ("        lfetch  [%0]": : "r"(x))
1639 #           define PREFETCH_FOR_WRITE(x) \
1640               __asm__ ("        lfetch.excl     [%0]": : "r"(x))
1641 #           define CLEAR_DOUBLE(x) \
1642               __asm__ ("        stf.spill       [%0]=f0": : "r"((void *)(x)))
1643 #         else
1644 #           include <ia64intrin.h>
1645 #           define PREFETCH(x) \
1646               __lfetch(__lfhint_none, (x))
1647 #           define PREFETCH_FOR_WRITE(x) \
1648               __lfetch(__lfhint_nta,  (x))
1649 #           define CLEAR_DOUBLE(x) \
1650               __stf_spill((void *)(x), 0)
1651 #         endif // __INTEL_COMPILER
1652 #       endif
1653 #   endif
1654 #   ifdef MSWIN32
1655       /* FIXME: This is a very partial guess.  There is no port, yet.   */
1656 #     define OS_TYPE "MSWIN32"
1657                 /* STACKBOTTOM and DATASTART are handled specially in   */
1658                 /* os_dep.c.                                            */
1659 #     define DATAEND  /* not needed */
1660 #     if defined(_WIN64)
1661 #       define CPP_WORDSZ 64
1662 #     else
1663 #       define CPP_WORDSZ 32   /* Is this possible?     */
1664 #     endif
1665 #     define ALIGNMENT 8
1666 #   endif
1667 # endif
1668
1669 # ifdef M88K
1670 #   define MACH_TYPE "M88K"
1671 #   define ALIGNMENT 4
1672 #   define ALIGN_DOUBLE
1673     extern int etext[];
1674 #   ifdef CX_UX
1675 #       define OS_TYPE "CX_UX"
1676 #       define DATASTART ((((word)etext + 0x3fffff) & ~0x3fffff) + 0x10000)
1677 #   endif
1678 #   ifdef  DGUX
1679 #       define OS_TYPE "DGUX"
1680         extern ptr_t GC_SysVGetDataStart();
1681 #       define DATASTART GC_SysVGetDataStart(0x10000, etext)
1682 #   endif
1683 #   define STACKBOTTOM ((char*)0xf0000000) /* determined empirically */
1684 # endif
1685
1686 # ifdef S370
1687     /* If this still works, and if anyone cares, this should probably   */
1688     /* be moved to the S390 category.                                   */
1689 #   define MACH_TYPE "S370"
1690 #   define ALIGNMENT 4  /* Required by hardware */
1691 #   define USE_GENERIC_PUSH_REGS
1692 #   ifdef UTS4
1693 #       define OS_TYPE "UTS4"
1694        extern int etext[];
1695         extern int _etext[];
1696         extern int _end[];
1697         extern ptr_t GC_SysVGetDataStart();
1698 #       define DATASTART GC_SysVGetDataStart(0x10000, _etext)
1699 #       define DATAEND (_end)
1700 #       define HEURISTIC2
1701 #   endif
1702 # endif
1703
1704 # ifdef S390
1705 #   define MACH_TYPE "S390"
1706 #   define USE_GENERIC_PUSH_REGS
1707 #   ifndef __s390x__
1708 #   define ALIGNMENT 4
1709 #   define CPP_WORDSZ 32
1710 #   else
1711 #   define ALIGNMENT 8
1712 #   define CPP_WORDSZ 64
1713 #   define HBLKSIZE 4096
1714 #   endif
1715 #   ifdef LINUX
1716 #       define OS_TYPE "LINUX"
1717 #       define LINUX_STACKBOTTOM
1718 #       define DYNAMIC_LOADING
1719        extern int __data_start[];
1720 #       define DATASTART ((ptr_t)(__data_start))
1721     extern int _end[];
1722 #   define DATAEND (_end)
1723 #   define CACHE_LINE_SIZE 256
1724 #   define GETPAGESIZE() 4096
1725 #   endif
1726 # endif
1727
1728 # if defined(PJ)
1729 #   define ALIGNMENT 4
1730     extern int _etext[];
1731 #   define DATASTART ((ptr_t)(_etext))
1732 #   define HEURISTIC1
1733 # endif
1734
1735 # ifdef ARM32
1736 #   define CPP_WORDSZ 32
1737 #   define MACH_TYPE "ARM32"
1738 #   define ALIGNMENT 4
1739 #   ifdef NETBSD
1740 #       define OS_TYPE "NETBSD"
1741 #       define HEURISTIC2
1742 #       ifdef __ELF__
1743 #          define DATASTART GC_data_start
1744 #          define DYNAMIC_LOADING
1745 #       else
1746            extern char etext[];
1747 #          define DATASTART ((ptr_t)(etext))
1748 #       endif
1749 #       define USE_GENERIC_PUSH_REGS
1750 #   endif
1751 #   ifdef LINUX
1752 #       define OS_TYPE "LINUX"
1753 #       define HEURISTIC1
1754 #       undef STACK_GRAN
1755 #       define STACK_GRAN 0x10000000
1756 #       define USE_GENERIC_PUSH_REGS
1757 #       ifdef __ELF__
1758 #            define DYNAMIC_LOADING
1759 #            include <features.h>
1760 #            if defined(__GLIBC__) && __GLIBC__ >= 2
1761 #                define SEARCH_FOR_DATA_START
1762 #            else
1763                  extern char **__environ;
1764 #                define DATASTART ((ptr_t)(&__environ))
1765                               /* hideous kludge: __environ is the first */
1766                               /* word in crt0.o, and delimits the start */
1767                               /* of the data segment, no matter which   */
1768                               /* ld options were passed through.        */
1769                               /* We could use _etext instead, but that  */
1770                               /* would include .rodata, which may       */
1771                               /* contain large read-only data tables    */
1772                               /* that we'd rather not scan.             */
1773 #            endif
1774              extern int _end[];
1775 #            define DATAEND (_end)
1776 #       else
1777              extern int etext[];
1778 #            define DATASTART ((ptr_t)((((word) (etext)) + 0xfff) & ~0xfff))
1779 #       endif
1780 #   endif
1781 #   ifdef MSWINCE
1782 #     define OS_TYPE "MSWINCE"
1783 #     define DATAEND /* not needed */
1784 #   endif
1785 #   ifdef NOSYS
1786       /* __data_start is usually defined in the target linker script.  */
1787       extern int __data_start[];
1788 #     define DATASTART (ptr_t)(__data_start)
1789 #     define USE_GENERIC_PUSH_REGS
1790       /* __stack_base__ is set in newlib/libc/sys/arm/crt0.S  */
1791       extern void *__stack_base__;
1792 #     define STACKBOTTOM ((ptr_t) (__stack_base__))
1793 #   endif
1794 #endif
1795
1796 # ifdef SH
1797 #   define MACH_TYPE "SH"
1798 #   define ALIGNMENT 4
1799 #   ifdef MSWINCE
1800 #     define OS_TYPE "MSWINCE"
1801 #     define DATAEND /* not needed */
1802 #   endif
1803 #   ifdef LINUX
1804 #     define OS_TYPE "LINUX"
1805 #     define STACKBOTTOM ((ptr_t) 0x7c000000)
1806 #     define USE_GENERIC_PUSH_REGS
1807 #     define DYNAMIC_LOADING
1808 #     define SEARCH_FOR_DATA_START
1809       extern int _end[];
1810 #     define DATAEND (_end)
1811 #   endif
1812 # endif
1813  
1814 # ifdef SH4
1815 #   define MACH_TYPE "SH4"
1816 #   define OS_TYPE "MSWINCE"
1817 #   define ALIGNMENT 4
1818 #   define DATAEND /* not needed */
1819 # endif
1820
1821 # ifdef X86_64
1822 #   define MACH_TYPE "X86_64"
1823 #   define ALIGNMENT 8
1824 #   define CPP_WORDSZ 64
1825 #   ifndef HBLKSIZE
1826 #     define HBLKSIZE 4096
1827 #   endif
1828 #   define CACHE_LINE_SIZE 64
1829 #   define USE_GENERIC_PUSH_REGS
1830 #   ifdef LINUX
1831 #       define OS_TYPE "LINUX"
1832 #       define LINUX_STACKBOTTOM
1833 #       if !defined(GC_LINUX_THREADS) || !defined(REDIRECT_MALLOC)
1834 #           define MPROTECT_VDB
1835 #       else
1836             /* We seem to get random errors in incremental mode,        */
1837             /* possibly because Linux threads is itself a malloc client */
1838             /* and can't deal with the signals.                         */
1839 #       endif
1840 #       ifdef __ELF__
1841 #            define DYNAMIC_LOADING
1842 #            ifdef UNDEFINED    /* includes ro data */
1843                extern int _etext[];
1844 #              define DATASTART ((ptr_t)((((word) (_etext)) + 0xfff) & ~0xfff))
1845 #            endif
1846 #            include <features.h>
1847 #            define SEARCH_FOR_DATA_START
1848              extern int _end[];
1849 #            define DATAEND (_end)
1850 #       else
1851              extern int etext[];
1852 #            define DATASTART ((ptr_t)((((word) (etext)) + 0xfff) & ~0xfff))
1853 #       endif
1854 #       if defined(__GNUC__) && __GNUC >= 3
1855 #           define PREFETCH(x) __builtin_prefetch((x), 0, 0)
1856 #           define PREFETCH_FOR_WRITE(x) __builtin_prefetch((x), 1)
1857 #       endif
1858 #   endif
1859 #   ifdef NETBSD
1860 #       define OS_TYPE "NETBSD"
1861 #       ifdef __ELF__
1862 #           define DYNAMIC_LOADING
1863 #       endif
1864 #       define HEURISTIC2
1865         extern char etext[];
1866 #       define SEARCH_FOR_DATA_START
1867 #   endif
1868 # endif
1869
1870 #if defined(LINUX) && defined(USE_MMAP)
1871     /* The kernel may do a somewhat better job merging mappings etc.    */
1872     /* with anonymous mappings.                                         */
1873 #   define USE_MMAP_ANON
1874 #endif
1875
1876 #if defined(LINUX) && defined(REDIRECT_MALLOC)
1877     /* Rld appears to allocate some memory with its own allocator, and  */
1878     /* some through malloc, which might be redirected.  To make this    */
1879     /* work with collectable memory, we have to scan memory allocated   */
1880     /* by rld's internal malloc.                                        */
1881 #   define USE_PROC_FOR_LIBRARIES
1882 #endif
1883     
1884 # ifndef STACK_GROWS_UP
1885 #   define STACK_GROWS_DOWN
1886 # endif
1887
1888 # ifndef CPP_WORDSZ
1889 #   define CPP_WORDSZ 32
1890 # endif
1891
1892 # ifndef OS_TYPE
1893 #   define OS_TYPE ""
1894 # endif
1895
1896 # ifndef DATAEND
1897     extern int end[];
1898 #   define DATAEND (end)
1899 # endif
1900
1901 # if defined(SVR4) && !defined(GETPAGESIZE)
1902 #    include <unistd.h>
1903 #    define GETPAGESIZE()  sysconf(_SC_PAGESIZE)
1904 # endif
1905
1906 # ifndef GETPAGESIZE
1907 #   if defined(SUNOS5) || defined(IRIX5)
1908 #       include <unistd.h>
1909 #   endif
1910 #   define GETPAGESIZE() getpagesize()
1911 # endif
1912
1913 # if defined(SUNOS5) || defined(DRSNX) || defined(UTS4)
1914             /* OS has SVR4 generic features.  Probably others also qualify.     */
1915 #   define SVR4
1916 # endif
1917
1918 # if defined(SUNOS5) || defined(DRSNX)
1919             /* OS has SUNOS5 style semi-undocumented interface to dynamic       */
1920             /* loader.                                                          */
1921 #   define SUNOS5DL
1922             /* OS has SUNOS5 style signal handlers.                             */
1923 #   define SUNOS5SIGS
1924 # endif
1925
1926 # if defined(HPUX)
1927 #   define SUNOS5SIGS
1928 # endif
1929
1930 # if defined(FREEBSD) && (__FreeBSD__ >= 4)
1931 #   define SUNOS5SIGS
1932 # endif
1933
1934 # if defined(SVR4) || defined(LINUX) || defined(IRIX5) || defined(HPUX) \
1935             || defined(OPENBSD) || defined(NETBSD) || defined(FREEBSD) \
1936             || defined(DGUX) || defined(BSD) || defined(SUNOS4) \
1937             || defined(_AIX) || defined(DARWIN) || defined(OSF1)
1938 #   define UNIX_LIKE   /* Basic Unix-like system calls work.    */
1939 # endif
1940
1941 # if CPP_WORDSZ != 32 && CPP_WORDSZ != 64
1942            -> bad word size
1943 # endif
1944
1945 # ifdef PCR
1946 #   undef DYNAMIC_LOADING
1947 #   undef STACKBOTTOM
1948 #   undef HEURISTIC1
1949 #   undef HEURISTIC2
1950 #   undef PROC_VDB
1951 #   undef MPROTECT_VDB
1952 #   define PCR_VDB
1953 # endif
1954
1955 # ifdef SRC_M3
1956         /* Postponed for now. */
1957 #   undef PROC_VDB
1958 #   undef MPROTECT_VDB
1959 # endif
1960
1961 # ifdef SMALL_CONFIG
1962         /* Presumably not worth the space it takes. */
1963 #   undef PROC_VDB
1964 #   undef MPROTECT_VDB
1965 # endif
1966
1967 # ifdef USE_MUNMAP
1968 #   undef MPROTECT_VDB  /* Can't deal with address space holes. */
1969 # endif
1970
1971 # ifdef PARALLEL_MARK
1972 #   undef MPROTECT_VDB  /* For now.     */
1973 # endif
1974
1975 # if !defined(PCR_VDB) && !defined(PROC_VDB) && !defined(MPROTECT_VDB)
1976 #   define DEFAULT_VDB
1977 # endif
1978
1979 # ifndef PREFETCH
1980 #   define PREFETCH(x)
1981 #   define NO_PREFETCH
1982 # endif
1983
1984 # ifndef PREFETCH_FOR_WRITE
1985 #   define PREFETCH_FOR_WRITE(x)
1986 #   define NO_PREFETCH_FOR_WRITE
1987 # endif
1988
1989 # ifndef CACHE_LINE_SIZE
1990 #   define CACHE_LINE_SIZE 32   /* Wild guess   */
1991 # endif
1992
1993 # ifdef LINUX
1994 #   define REGISTER_LIBRARIES_EARLY
1995     /* We sometimes use dl_iterate_phdr, which may acquire an internal  */
1996     /* lock.  This isn't safe after the world has stopped.  So we must  */
1997     /* call GC_register_dynamic_libraries before stopping the world.    */
1998     /* For performance reasons, this may be beneficial on other         */
1999     /* platforms as well, though it should be avoided in win32.         */
2000 # endif /* LINUX */
2001
2002 # if defined(SEARCH_FOR_DATA_START)
2003     extern ptr_t GC_data_start;
2004 #   define DATASTART GC_data_start
2005 # endif
2006
2007 # ifndef CLEAR_DOUBLE
2008 #   define CLEAR_DOUBLE(x) \
2009                 ((word*)x)[0] = 0; \
2010                 ((word*)x)[1] = 0;
2011 # endif /* CLEAR_DOUBLE */
2012
2013         /* Internally we use GC_SOLARIS_THREADS to test for either old or pthreads. */
2014 # if defined(GC_SOLARIS_PTHREADS) && !defined(GC_SOLARIS_THREADS)
2015 #   define GC_SOLARIS_THREADS
2016 # endif
2017
2018 # if defined(GC_IRIX_THREADS) && !defined(IRIX5)
2019         --> inconsistent configuration
2020 # endif
2021 # if defined(GC_LINUX_THREADS) && !defined(LINUX)
2022         --> inconsistent configuration
2023 # endif
2024 # if defined(GC_SOLARIS_THREADS) && !defined(SUNOS5)
2025         --> inconsistent configuration
2026 # endif
2027 # if defined(GC_HPUX_THREADS) && !defined(HPUX)
2028         --> inconsistent configuration
2029 # endif
2030 # if defined(GC_AIX_THREADS) && !defined(_AIX)
2031         --> inconsistent configuration
2032 # endif
2033 # if defined(GC_WIN32_THREADS) && !defined(MSWIN32) && !defined(CYGWIN32)
2034         --> inconsistent configuration
2035 # endif
2036
2037 # if defined(PCR) || defined(SRC_M3) || \
2038                 defined(GC_SOLARIS_THREADS) || defined(GC_WIN32_THREADS) || \
2039                 defined(GC_PTHREADS)
2040 #   define THREADS
2041 # endif
2042
2043 # if defined(HP_PA) || defined(M88K) || defined(POWERPC) && !defined(DARWIN) \
2044              || defined(LINT) || defined(MSWINCE) || defined(ARM32) \
2045              || (defined(I386) && defined(__LCC__))
2046         /* Use setjmp based hack to mark from callee-save registers.    */
2047         /* The define should move to the individual platform            */
2048         /* descriptions.                                                */
2049 #       define USE_GENERIC_PUSH_REGS
2050 # endif
2051
2052 # if defined(MSWINCE)
2053 #   define NO_GETENV
2054 # endif
2055
2056 # if defined(SPARC)
2057 #   define ASM_CLEAR_CODE       /* Stack clearing is crucial, and we    */
2058                                 /* include assembly code to do it well. */
2059 # endif
2060
2061   /* Can we save call chain in objects for debugging?                   */
2062   /* SET NFRAMES (# of saved frames) and NARGS (#of args for each       */
2063   /* frame) to reasonable values for the platform.                      */
2064   /* Set SAVE_CALL_CHAIN if we can.  SAVE_CALL_COUNT can be specified   */
2065   /* at build time, though we feel free to adjust it slightly.          */
2066   /* Define NEED_CALLINFO if we either save the call stack or           */
2067   /* GC_ADD_CALLER is defined.                                          */
2068   /* GC_CAN_SAVE_CALL_STACKS is set in gc.h.                            */
2069
2070 #if defined(SPARC)
2071 # define CAN_SAVE_CALL_ARGS
2072 #endif
2073 #if (defined(I386) || defined(X86_64)) && defined(LINUX)
2074             /* SAVE_CALL_CHAIN is supported if the code is compiled to save     */
2075             /* frame pointers by default, i.e. no -fomit-frame-pointer flag.    */
2076 # define CAN_SAVE_CALL_ARGS
2077 #endif
2078
2079 # if defined(SAVE_CALL_COUNT) && !defined(GC_ADD_CALLER) \
2080              && defined(GC_CAN_SAVE_CALL_STACKS)
2081 #   define SAVE_CALL_CHAIN 
2082 # endif
2083 # ifdef SAVE_CALL_CHAIN
2084 #   if defined(SAVE_CALL_NARGS) && defined(CAN_SAVE_CALL_ARGS)
2085 #     define NARGS SAVE_CALL_NARGS
2086 #   else
2087 #     define NARGS 0    /* Number of arguments to save for each call.   */
2088 #   endif
2089 # endif
2090 # ifdef SAVE_CALL_CHAIN
2091 #   ifndef SAVE_CALL_COUNT
2092 #     define NFRAMES 6  /* Number of frames to save. Even for           */
2093                                 /* alignment reasons.                           */
2094 #   else
2095 #     define NFRAMES ((SAVE_CALL_COUNT + 1) & ~1)
2096 #   endif
2097 #   define NEED_CALLINFO
2098 # endif /* SAVE_CALL_CHAIN */
2099 # ifdef GC_ADD_CALLER
2100 #   define NFRAMES 1
2101 #   define NARGS 0
2102 #   define NEED_CALLINFO
2103 # endif
2104
2105 # if defined(MAKE_BACK_GRAPH) && !defined(DBG_HDRS_ALL)
2106 #   define DBG_HDRS_ALL
2107 # endif
2108
2109 # if defined(POINTER_MASK) && !defined(POINTER_SHIFT)
2110 #   define POINTER_SHIFT 0
2111 # endif
2112
2113 # if defined(POINTER_SHIFT) && !defined(POINTER_MASK)
2114 #   define POINTER_MASK ((GC_word)(-1))
2115 # endif
2116
2117 # if !defined(FIXUP_POINTER) && defined(POINTER_MASK)
2118 #   define FIXUP_POINTER(p) (p) = ((p) & (POINTER_MASK) << POINTER_SHIFT)
2119 # endif
2120
2121 # if defined(FIXUP_POINTER)
2122 #   define NEED_FIXUP_POINTER 1
2123 # else
2124 #   define NEED_FIXUP_POINTER 0
2125 #   define FIXUP_POINTER(p)
2126 # endif
2127
2128 #ifdef GC_PRIVATE_H
2129         /* This relies on some type definitions from gc_priv.h, from    */
2130         /* where it's normally included.                                */
2131         /*                                                              */
2132         /* How to get heap memory from the OS:                          */
2133         /* Note that sbrk()-like allocation is preferred, since it      */
2134         /* usually makes it possible to merge consecutively allocated   */
2135         /* chunks.  It also avoids unintented recursion with            */
2136         /* -DREDIRECT_MALLOC.                                           */
2137         /* GET_MEM() returns a HLKSIZE aligned chunk.                   */
2138         /* 0 is taken to mean failure.                                  */
2139         /* In the case os USE_MMAP, the argument must also be a         */
2140         /* physical page size.                                          */
2141         /* GET_MEM is currently not assumed to retrieve 0 filled space, */
2142         /* though we should perhaps take advantage of the case in which */
2143         /* does.                                                        */
2144         struct hblk;    /* See gc_priv.h.       */
2145 # ifdef PCR
2146             char * real_malloc();
2147 #   define GET_MEM(bytes) HBLKPTR(real_malloc((size_t)bytes + GC_page_size) \
2148                                           + GC_page_size-1)
2149 # else
2150 #   ifdef OS2
2151               void * os2_alloc(size_t bytes);
2152 #     define GET_MEM(bytes) HBLKPTR((ptr_t)os2_alloc((size_t)bytes \
2153                                             + GC_page_size) \
2154                                             + GC_page_size-1)
2155 #   else
2156 #     if defined(NEXT) || defined(DOS4GW) || \
2157                  (defined(AMIGA) && !defined(GC_AMIGA_FASTALLOC)) || \
2158                  (defined(SUNOS5) && !defined(USE_MMAP))
2159 #       define GET_MEM(bytes) HBLKPTR((size_t) \
2160                                               calloc(1, (size_t)bytes + GC_page_size) \
2161                                               + GC_page_size-1)
2162 #     else
2163 #       ifdef MSWIN32
2164           extern ptr_t GC_win32_get_mem();
2165 #         define GET_MEM(bytes) (struct hblk *)GC_win32_get_mem(bytes)
2166 #       else
2167 #         ifdef MACOS
2168 #           if defined(USE_TEMPORARY_MEMORY)
2169                         extern Ptr GC_MacTemporaryNewPtr(size_t size,
2170                                                          Boolean clearMemory);
2171 #               define GET_MEM(bytes) HBLKPTR( \
2172                             GC_MacTemporaryNewPtr(bytes + GC_page_size, true) \
2173                             + GC_page_size-1)
2174 #           else
2175 #                   define GET_MEM(bytes) HBLKPTR( \
2176                                 NewPtrClear(bytes + GC_page_size) + GC_page_size-1)
2177 #           endif
2178 #         else
2179 #           ifdef MSWINCE
2180               extern ptr_t GC_wince_get_mem();
2181 #             define GET_MEM(bytes) (struct hblk *)GC_wince_get_mem(bytes)
2182 #           else
2183 #             if defined(AMIGA) && defined(GC_AMIGA_FASTALLOC)
2184                         extern void *GC_amiga_get_mem(size_t size);
2185 #                       define GET_MEM(bytes) HBLKPTR((size_t) \
2186                           GC_amiga_get_mem((size_t)bytes + GC_page_size) \
2187                           + GC_page_size-1)
2188 #             else
2189                 extern ptr_t GC_unix_get_mem();
2190 #               define GET_MEM(bytes) (struct hblk *)GC_unix_get_mem(bytes)
2191 #             endif
2192 #           endif
2193 #         endif
2194 #       endif
2195 #     endif
2196 #   endif
2197 # endif
2198
2199 #endif /* GC_PRIVATE_H */
2200
2201 # endif /* GCCONFIG_H */