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