1 /* -*-C-*-
2 
3 Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
4     1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
5     2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 Massachusetts
6     Institute of Technology
7 
8 This file is part of MIT/GNU Scheme.
9 
10 MIT/GNU Scheme is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2 of the License, or (at
13 your option) any later version.
14 
15 MIT/GNU Scheme is distributed in the hope that it will be useful, but
16 WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18 General Public License for more details.
19 
20 You should have received a copy of the GNU General Public License
21 along with MIT/GNU Scheme; if not, write to the Free Software
22 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301,
23 USA.
24 
25 */
26 
27 /* Shared part of "config.h".  */
28 
29 #ifndef SCM_CONFSHARED_H
30 #define SCM_CONFSHARED_H
31 
32 #ifndef __STDC__
33 #  include "error: compiler must support ANSI C"
34 #endif
35 
36 /* Enable the stepper.  */
37 #define COMPILE_STEPPER 1
38 
39 #ifdef ENABLE_DEBUGGING_TOOLS
40 #  undef NDEBUG			/* for assert() */
41 #  define WHEN_DEBUGGING(code) do { code } while (0)
42 #  define ENABLE_PRIMITIVE_PROFILING
43 #else
44 #  define NDEBUG 1		/* for assert() */
45 #  define WHEN_DEBUGGING(code) do {} while (0)
46 #  undef ENABLE_PRIMITIVE_PROFILING
47 #endif
48 
49 /* For use in the C pre-processor, not in code!  */
50 #define FALSE 0
51 #define TRUE 1
52 
53 #include <stdio.h>
54 #include <math.h>
55 
56 #if STDC_HEADERS
57 #  include <stdlib.h>
58 #  include <stdarg.h>
59 #  include <stddef.h>
60 #  include <string.h>
61 #  include <ctype.h>
62 #  include <limits.h>
63 #  include <float.h>
64 #  include <assert.h>
65 #else
66 #  ifdef HAVE_LIMITS_H
67 #    include <limits.h>
68 #  endif
69 #  ifdef HAVE_FLOAT_H
70 #    include <float.h>
71 #  else
72 #    include "float.h"
73 #  endif
74 #  ifdef HAVE_ASSERT_H
75 #    include <assert.h>
76 #  endif
77 #  ifdef HAVE_MALLOC_H
78 #    include <malloc.h>
79 #  endif
80 #  if !HAVE_STRCHR
81 #    define strchr index
82 #    define strrchr rindex
83 #  endif
84    extern char * strchr ();
85    extern char * strrchr ();
86 #  if !HAVE_MEMCPY
87 #    define memcpy(d, s, n) bcopy ((s), (d), (n))
88 #    define memmove(d, s, n) bcopy ((s), (d), (n))
89 #  endif
90 #endif
91 
92 #ifdef HAVE_STDBOOL_H
93 #  include <stdbool.h>
94 #else
95 #  ifndef HAVE__BOOL
96 #    ifdef __cplusplus
97        typedef bool _Bool;
98 #    else
99        typedef unsigned char _Bool;
100 #    endif
101 #  endif
102 #  define bool _Bool
103 #  define false 0
104 #  define true 1
105 #  define __bool_true_false_are_defined 1
106 #  if ((defined (__GNUC__)) && (__GNUC__ < 3))
107      /* Old versions of GCC have an incompatible <stdbool.h>.
108 	This declaration should prevent them from overriding our defs.  */
109 #    define __STDBOOL_H__ 1
110 #  endif
111 #endif
112 
113 #ifdef HAVE_STDINT_H
114 #  include <stdint.h>
115 #endif
116 
117 #if (CHAR_BIT != 8)
118 #  include "error: characters must be 8 bits wide"
119 #endif
120 
121 #if (FLT_RADIX != 2)
122 #  include "error: floating-point radix must be 2"
123 #endif
124 
125 #if (SIZEOF_UINTPTR_T > SIZEOF_UNSIGNED_LONG)
126 #  include "error: pointers must fit in 'unsigned long'"
127 #endif
128 
129 #ifndef OFF_T_MAX
130 #  if SIZEOF_OFF_T < SIZEOF_INTMAX_T
131 #    define OFF_T_MAX (~ ((~ ((intmax_t) 0)) << (CHAR_BIT * SIZEOF_OFF_T)))
132 #  else
133 #    define OFF_T_MAX INTMAX_MAX
134 #  endif
135 #endif
136 
137 #ifndef TIME_T_MAX
138 #  if SIZEOF_TIME_T < SIZEOF_INTMAX_T
139 #    define TIME_T_MAX (~ ((~ ((intmax_t) 0)) << (CHAR_BIT * SIZEOF_TIME_T)))
140 #  else
141 #    define TIME_T_MAX INTMAX_MAX
142 #  endif
143 #endif
144 
145 #if ((defined (__GNUC__)) && (__GNUC__ >= 3))
146 #  define ATTRIBUTE(x) __attribute__ (x)
147 #  define NORETURN __attribute__ ((__noreturn__))
148 #else
149 #  define ATTRIBUTE(x)
150 #  define NORETURN
151 #endif
152 
153 /* Operating System / Machine dependencies:
154 
155    For each implementation, be sure to specify CURRENT_FASL_ARCH.
156    Make sure that there is an appropriate FASL_<machine name>.
157    If there isn't, add one to the list below.
158 
159    If you do not know the values of the parameters specified below,
160    try compiling and running the Wsize program ("make Wsize" if on a
161    unix variant).  It may not run, but if it does, it will probably
162    compute the correct information.
163 
164    Note that the C type void is used in the sources.  If your version
165    of C does not have this type, you should bypass it.  This can be
166    done by inserting the preprocessor command '#define void' in this
167    file, under the heading for your kind of machine.
168 
169    These parameters MUST be specified (and are computed by Wsize):
170 
171    CHAR_BIT is the size of a character in bits.
172 
173    FLOATING_ALIGNMENT should be defined ONLY if the system requires
174    floating point numbers (double) to be aligned more strictly than
175    SCHEME_OBJECTs (unsigned long).  The value must be a mask of the
176    low order bits which are required to be zero for the storage
177    address.  For example, a value of 0x7 requires octabyte alignment
178    on a machine where addresses are specified in bytes.  The alignment
179    must be an integral multiple of the length of a long.
180 
181    Other flags (the safe option is NOT to define them, which will
182    sacrifice speed for safety):
183 
184    HEAP_IN_LOW_MEMORY should be defined if malloc returns the lowest
185    available memory and thus all addresses will fit in the datum portion
186    of a Scheme object.  The datum portion of a Scheme object is 8 bits
187    less than the length of a C long.  */
188 
189 /* Possible values for CURRENT_FASL_ARCH.  For the most part this
190    means the processor type, so for example there are several aliases
191    for 68000 family processors.  This scheme allows sharing of
192    compiled code on machines with the same processor type.  Probably
193    we will have to create a more powerful method of identifying FASL
194    files when we introduce new differences, such as whether or not a
195    68881 coprocessor is installed. */
196 
197 typedef enum
198 {
199   FASL_UNKNOWN,
200   FASL_PDP10,
201   FASL_VAX,
202   FASL_68020,
203   FASL_68000,
204   FASL_HP_9000_500,
205   FASL_IA32,
206   FASL_BFLY,
207   FASL_CYBER,
208   FASL_CELERITY,
209   FASL_HP_SPECTRUM,
210   FASL_UMAX,
211   FASL_PYR,
212   FASL_ALLIANT,
213   FASL_SPARC,
214   FASL_MIPS,
215   FASL_APOLLO_68K,
216   FASL_APOLLO_PRISM,
217   FASL_ALPHA,
218   FASL_RS6000,
219   FASL_PPC32,
220   FASL_X86_64,
221   FASL_PPC64,
222   FASL_IA64,
223   FASL_ARM,
224 } fasl_arch_t;
225 
226 /* Possible values for COMPILER_PROCESSOR_TYPE.  This identifies the
227    processor for which native-code support is provided.  This is
228    related to the fasl_arch_t types above, but can also take on values
229    that are independent of the host architecture.  */
230 
231 typedef enum
232 {
233   COMPILER_NONE_TYPE,
234   COMPILER_MC68020_TYPE,
235   COMPILER_VAX_TYPE,
236   COMPILER_SPECTRUM_TYPE,
237   COMPILER_OLD_MIPS_TYPE,
238   COMPILER_MC68040_TYPE,
239   COMPILER_SPARC_TYPE,
240   COMPILER_RS6000_TYPE,
241   COMPILER_MC88K_TYPE,
242   COMPILER_IA32_TYPE,
243   COMPILER_ALPHA_TYPE,
244   COMPILER_MIPS_TYPE,
245   COMPILER_C_TYPE,
246   COMPILER_SVM_TYPE,
247   COMPILER_X86_64_TYPE,
248 } cc_arch_t;
249 
250 #include "cmpintmd-config.h"
251 
252 #ifdef vax
253 
254 /* Amazingly unix and vms agree on all these */
255 
256 #define MACHINE_TYPE		"vax"
257 #define CURRENT_FASL_ARCH	FASL_VAX
258 #define PC_ZERO_BITS		0
259 #define HEAP_IN_LOW_MEMORY	1
260 
261 /* Not on these, however */
262 
263 #ifdef vms
264 
265 #define VMS_VERSION		4
266 #define VMS_SUBVERSION		5
267 
268 /* If your C runtime library already defines the `tbuffer' datatype,
269    then define this symbol. */
270 /* #define HAVE_TBUFFER */
271 
272 /* Name conflict in VMS with system variable */
273 #define Free			Free_Register
274 
275 #if (VMS_VERSION < 4)
276    /* Pre version 4 VMS has no void type. */
277 #  define void
278 #endif
279 
280 /* This eliminates a spurious warning from the C compiler. */
281 #define main_type
282 
283 /* exit(0) produces horrible message on VMS */
284 #define NORMAL_EXIT 1
285 
286 #define EXIT_SCHEME_DECLARATIONS static jmp_buf exit_scheme_jmp_buf
287 
288 #define INIT_EXIT_SCHEME()						\
289 {									\
290   int which_way = (setjmp (exit_scheme_jmp_buf));			\
291   if (which_way == NORMAL_EXIT)						\
292     return;								\
293 }
294 
295 #define EXIT_SCHEME(value)						\
296 {									\
297   if (value != 0)							\
298     exit (value);							\
299   longjmp (exit_scheme_jmp_buf, NORMAL_EXIT);				\
300 }
301 
302 #else /* not vms */
303 
304 /* Vax Unix C compiler bug */
305 #define HAVE_DOUBLE_TO_LONG_BUG
306 
307 #endif /* not vms */
308 #endif /* vax */
309 
310 #if defined(hp9000s800) || defined(__hp9000s800)
311 #if defined(hp9000s700) || defined(__hp9000s700)
312 #define MACHINE_TYPE		"hp9000s700"
313 #else
314 #define MACHINE_TYPE		"hp9000s800"
315 #endif
316 #define CURRENT_FASL_ARCH	FASL_HP_SPECTRUM
317 #define PC_ZERO_BITS		2
318 #define FLOATING_ALIGNMENT	0x7
319 
320 /* Heap resides in data space, pointed at by space register 5.
321    Short pointers must have their high two bits set to 01 so that
322    it is interpreted as space register 5, 2nd quadrant.
323 
324    This is kludged by the definitions below, and is still considered
325    HEAP_IN_LOW_MEMORY.  */
326 
327 #define HEAP_IN_LOW_MEMORY
328 
329 /* data segment bits and mask for all bits */
330 
331 #define HPPA_QUAD_BIT	0x40000000
332 #define HPPA_QUAD_MASK	0xC0000000
333 
334 #define DATUM_TO_ADDRESS(datum)						\
335   ((SCHEME_OBJECT *) (((unsigned long) (datum)) | HPPA_QUAD_BIT))
336 
337 #define ADDRESS_TO_DATUM(address)					\
338   ((SCHEME_OBJECT) (((unsigned long) (address)) & (~(HPPA_QUAD_MASK))))
339 
340 /* SHARP_F is a magic value:
341    Typecode TC_CONSTANT, high datum bits #b100, low datum bits are the top
342    TYPE_CODE_LENGTH bits of HPPA_QUAD_BIT
343 
344    SHARP_F is stored in gr5 for access by compiled code.  This allows
345    us to generate #F and test against #F quickly, and also to use gr5
346    for compiled OBJECT->ADDRESS operations.  If we ever go to 5bit
347    typecodes we will be able to dispense with this overloading.
348 
349    See also cmpauxmd/hppa.m4.  */
350 
351 #define SHARP_F         0x22000010
352 
353 #endif /* hp9000s800 */
354 
355 #if defined(hp9000s300) || defined(__hp9000s300)
356 
357 #if defined(hp9000s400) || defined(__hp9000s400)
358 #  define MACHINE_TYPE		"hp9000s400"
359 #else
360 #  define MACHINE_TYPE		"hp9000s300"
361 #endif
362 
363 #ifdef MC68010
364 #  define CURRENT_FASL_ARCH	FASL_68000
365 #else
366 #  define CURRENT_FASL_ARCH	FASL_68020
367 #endif
368 
369 #define PC_ZERO_BITS		1
370 #define HEAP_IN_LOW_MEMORY	1
371 
372 #endif /* hp9000s300 */
373 
374 #ifdef hp9000s500
375 #define MACHINE_TYPE		"hp9000s500"
376 #define CURRENT_FASL_ARCH 	FASL_HP_9000_500
377 
378 /* An unfortunate fact of life on this machine:
379    the C heap is in high memory thus HEAP_IN_LOW_MEMORY is not
380    defined and the whole thing runs slowly.  */
381 
382 #endif /* hp9000s500 */
383 
384 #ifdef __sparc
385 #  define MACHINE_TYPE		"sun4"
386 #  define CURRENT_FASL_ARCH	FASL_SPARC
387 #  define FLOATING_ALIGNMENT	0x7
388 #  define HEAP_IN_LOW_MEMORY
389 #  define HAVE_DOUBLE_TO_LONG_BUG
390 #endif
391 
392 #ifdef sun3
393 #  define MACHINE_TYPE		"sun3"
394 #  define CURRENT_FASL_ARCH	FASL_68020
395 #  define HEAP_IN_LOW_MEMORY
396 #  define HAVE_DOUBLE_TO_LONG_BUG
397 #endif
398 
399 #ifdef sun2
400 #  define MACHINE_TYPE		"sun2"
401 #  define CURRENT_FASL_ARCH	FASL_68000
402 #  define HEAP_IN_LOW_MEMORY
403 #  define HAVE_DOUBLE_TO_LONG_BUG
404 #endif
405 
406 #ifdef NeXT
407 #  define MACHINE_TYPE		"next"
408 #  define CURRENT_FASL_ARCH	FASL_68020
409 #  define HEAP_IN_LOW_MEMORY
410 #endif
411 
412 #if defined(_M_IX86) || defined(__i386__) || defined(__i386) || defined(i386)
413 #  define __IA32__
414 #endif
415 
416 #ifdef __IA32__
417 
418 #define CURRENT_FASL_ARCH	FASL_IA32
419 #define PC_ZERO_BITS		0
420 #define HEAP_IN_LOW_MEMORY	1
421 
422 #ifdef sequent
423 #  define MACHINE_TYPE		"sequent386"
424 #endif
425 
426 #ifdef sun
427 #  define MACHINE_TYPE		"sun386i"
428 #endif
429 
430 #ifndef MACHINE_TYPE
431 #  define MACHINE_TYPE		"IA-32"
432 #endif
433 
434 #endif /* __IA32__ */
435 
436 #ifdef mips
437 
438 #define MACHINE_TYPE		"mips"
439 #define CURRENT_FASL_ARCH	FASL_MIPS
440 #define PC_ZERO_BITS		2
441 #define FLOATING_ALIGNMENT   	0x7
442 
443 #ifdef _IRIX6
444    extern void * irix_heap_malloc (unsigned long);
445 #  define HEAP_MALLOC irix_heap_malloc
446 #endif
447 
448 /* Heap resides in data space which begins at 0x10000000. This is
449    kludged by the definitions below, and is still considered
450    HEAP_IN_LOW_MEMORY.  */
451 
452 #define HEAP_IN_LOW_MEMORY
453 #define MIPS_DATA_BIT	0x10000000
454 
455 #define DATUM_TO_ADDRESS(datum)						\
456   ((SCHEME_OBJECT *) (((unsigned long) (datum)) | MIPS_DATA_BIT))
457 
458 #define ADDRESS_TO_DATUM(address)					\
459   ((SCHEME_OBJECT) (((unsigned long) (address)) & (~(MIPS_DATA_BIT))))
460 
461 /* MIPS compiled binaries are large! */
462 #ifndef DEFAULT_SMALL_CONSTANT
463 #  define DEFAULT_SMALL_CONSTANT 700
464 #endif
465 
466 #ifndef DEFAULT_LARGE_CONSTANT
467 #  define DEFAULT_LARGE_CONSTANT 1500
468 #endif
469 
470 #endif /* mips */
471 
472 #ifdef __alpha
473 #define MACHINE_TYPE		"Alpha"
474 #define CURRENT_FASL_ARCH	FASL_ALPHA
475 #define PC_ZERO_BITS		2
476 #define HEAP_IN_LOW_MEMORY	1
477 
478 /* Flonums have no special alignment constraints. */
479 #define FLONUM_MANTISSA_BITS	53
480 #define FLONUM_EXPT_SIZE	10
481 #define MAX_FLONUM_EXPONENT	1023
482 /* Floating point representation uses hidden bit. */
483 
484 extern void * alpha_heap_malloc (unsigned long);
485 #define HEAP_MALLOC alpha_heap_malloc
486 
487 #endif /* __alpha */
488 
489 #ifdef __OS2__
490 
491 #define PREALLOCATE_HEAP_MEMORY()					\
492 {									\
493   extern void OS2_alloc_heap (void);					\
494   OS2_alloc_heap ();							\
495 }
496 
497 extern void * OS2_commit_heap (unsigned long);
498 #define HEAP_MALLOC OS2_commit_heap
499 #define HEAP_FREE(address)
500 
501 #define EXIT_SCHEME_DECLARATIONS extern void OS2_exit_scheme (int)
502 #define EXIT_SCHEME OS2_exit_scheme
503 
504 extern void OS2_stack_reset (void);
505 #define STACK_RESET OS2_stack_reset
506 
507 extern int OS2_stack_overflowed_p (void);
508 #define STACK_OVERFLOWED_P OS2_stack_overflowed_p
509 
510 #define CC_ARCH_INITIALIZE i386_interface_initialize
511 
512 #endif /* __OS2__ */
513 
514 #ifdef __WIN32__
515 
516 extern void win32_stack_reset (void);
517 #define STACK_RESET win32_stack_reset
518 
519 #define HEAP_MALLOC(size) (WIN32_ALLOCATE_HEAP ((size), (&scheme_heap_handle)))
520 #define HEAP_FREE(base)							\
521   WIN32_RELEASE_HEAP (((char *) (base)), scheme_heap_handle)
522 
523 /* We must not define `main' as that causes conflicts when compiling
524    this code with the Watcom C compiler.  */
525 #define main_name scheme_main
526 
527 #endif /* __WIN32__ */
528 
529 /* These (pdp10, nu) haven't worked in a while.
530    Should be upgraded or flushed some day.  */
531 
532 #ifdef pdp10
533 #define MACHINE_TYPE		"pdp10"
534 #define CURRENT_FASL_ARCH       FASL_PDP10
535 #define HEAP_IN_LOW_MEMORY
536 #define CHAR_BIT 36		/ * Ugh! Supposedly fixed in newer Cs * /
537 #define UNSIGNED_SHIFT_BUG
538 #endif
539 
540 #ifdef nu
541 #define MACHINE_TYPE		"nu"
542 #define CURRENT_FASL_ARCH	FASL_68000
543 #define HEAP_IN_LOW_MEMORY
544 #define UNSIGNED_SHIFT_BUG
545 #endif
546 
547 /* These are pretty old too, but more recent versions have run. */
548 
549 #ifdef butterfly
550 #define MACHINE_TYPE		"butterfly"
551 #define CURRENT_FASL_ARCH	FASL_BFLY
552 #define HEAP_IN_LOW_MEMORY
553 #include <public.h>
554 #endif
555 
556 #ifdef cyber180
557 #define MACHINE_TYPE		"cyber180"
558 #define CURRENT_FASL_ARCH	FASL_CYBER
559 #define HEAP_IN_LOW_MEMORY
560 #define UNSIGNED_SHIFT_BUG
561 /* The Cyber180 C compiler manifests a bug in hairy conditional expressions */
562 #define Conditional_Bug
563 #endif
564 
565 #ifdef celerity
566 #define MACHINE_TYPE		"celerity"
567 #define CURRENT_FASL_ARCH	FASL_CELERITY
568 #define HEAP_IN_LOW_MEMORY
569 #endif
570 
571 #ifdef umax
572 #define MACHINE_TYPE		"umax"
573 #define CURRENT_FASL_ARCH	FASL_UMAX
574 #define HEAP_IN_LOW_MEMORY
575 #endif
576 
577 #ifdef pyr
578 #define MACHINE_TYPE		"pyramid"
579 #define CURRENT_FASL_ARCH	FASL_PYR
580 #define HEAP_IN_LOW_MEMORY
581 #endif
582 
583 #ifdef alliant
584 #define MACHINE_TYPE		"alliant"
585 #define CURRENT_FASL_ARCH	FASL_ALLIANT
586 #define HEAP_IN_LOW_MEMORY
587 #endif
588 
589 #ifdef apollo
590 #if _ISP__M68K
591 #define MACHINE_TYPE          "Apollo 68k"
592 #define CURRENT_FASL_ARCH     FASL_APOLLO_68K
593 #else
594 #define MACHINE_TYPE          "Apollo Prism"
595 #define CURRENT_FASL_ARCH     FASL_APOLLO_PRISM
596 #endif
597 #define HEAP_IN_LOW_MEMORY
598 #endif
599 
600 #ifdef _IBMR2
601 #define MACHINE_TYPE          "IBM RS6000"
602 #define CURRENT_FASL_ARCH     FASL_RS6000
603 /* Heap is not in Low Memory. */
604 #define FLONUM_MANTISSA_BITS   53
605 #define FLONUM_EXPT_SIZE       10
606 #define MAX_FLONUM_EXPONENT    1023
607 #endif
608 
609 #ifdef __powerpc__
610 #  define __ppc__ 1
611 #endif
612 
613 #ifdef __powerpc64__
614 #  define __ppc64__ 1
615 #endif
616 
617 #ifdef __ppc__
618 #  define MACHINE_TYPE		"PowerPC-32"
619 #  define CURRENT_FASL_ARCH	FASL_PPC32
620 #  define FLOATING_ALIGNMENT	0x7
621 #endif
622 
623 #ifdef __ppc64__
624 #  define MACHINE_TYPE		"PowerPC-64"
625 #  define CURRENT_FASL_ARCH	FASL_PPC64
626 #endif
627 
628 #ifdef __x86_64__
629 #  define MACHINE_TYPE		"x86-64"
630 #  define CURRENT_FASL_ARCH	FASL_X86_64
631 #  define PC_ZERO_BITS		0
632 #  define HEAP_IN_LOW_MEMORY	1
633 #endif
634 
635 #ifdef __ia64__
636 #  define MACHINE_TYPE		"ia64"
637 #  define CURRENT_FASL_ARCH	FASL_IA64
638 #endif
639 
640 #ifdef __arm__
641 #  define MACHINE_TYPE		"arm"
642 #  define CURRENT_FASL_ARCH	FASL_ARM
643 #endif
644 
645 #ifdef sonyrisc
646       /* On the Sony NEWS 3250, this procedure initializes the
647 	 floating-point CPU control register to enable the IEEE traps.
648 	 This is normally executed by 'compiler_reset' from LOAD-BAND,
649 	 but the Sony operating system saves the control register in
650 	 'setjmp' and restores it on 'longjmp', so we must initialize
651 	 the register before 'setjmp' is called.  */
652 #define CC_ARCH_INITIALIZE interface_initialize
653 #endif
654 
655 /* Make sure that some definition applies.  If this error occurs, and
656    the parameters of the configuration are unknown, try the Wsize
657    program.  */
658 #ifndef MACHINE_TYPE
659 #  include "Error: confshared.h: Unknown configuration."
660 #endif
661 
662 #ifndef PC_ZERO_BITS
663 #  ifdef CC_IS_NATIVE
664 #    include "Error: confshared.h: Unknown PC alignment."
665 #  else
666 #    define PC_ZERO_BITS 0
667 #  endif
668 #endif
669 
670 #define PC_ALIGNED_P(pc)						\
671   ((((unsigned long) (pc)) & ((1 << PC_ZERO_BITS) - 1)) == 0)
672 
673 /* Virtually all machines have 8-bit characters these days, so don't
674    explicitly specify this value unless it is different.  */
675 #ifndef CHAR_BIT
676 #  define CHAR_BIT 8
677 #endif
678 
679 /* The GNU C compiler does not have any of these bugs. */
680 #ifdef __GNUC__
681 #  undef HAVE_DOUBLE_TO_LONG_BUG
682 #  undef UNSIGNED_SHIFT_BUG
683 #  undef Conditional_Bug
684 #endif
685 
686 #ifdef NO_HEAP_IN_LOW_MEMORY
687 #  undef HEAP_IN_LOW_MEMORY
688 #endif
689 
690 #if defined(USE_MMAP_HEAP_MALLOC) && defined(HEAP_IN_LOW_MEMORY)
691    extern void * mmap_heap_malloc (unsigned long);
692 #  define HEAP_MALLOC mmap_heap_malloc
693 #  define HEAP_FREE(address)
694 #endif
695 
696 #endif /* SCM_CONFSHARED_H */
697