home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / mitsch75.zip / scheme-7_5_17-src.zip / scheme-7.5.17 / src / microcode / bchgcc.h < prev    next >
C/C++ Source or Header  |  2000-12-05  |  7KB  |  249 lines

  1. /* -*-C-*-
  2.  
  3. $Id: bchgcc.h,v 9.63 2000/12/05 21:23:42 cph Exp $
  4.  
  5. Copyright (c) 1987-2000 Massachusetts Institute of Technology
  6.  
  7. This program is free software; you can redistribute it and/or modify
  8. it under the terms of the GNU General Public License as published by
  9. the Free Software Foundation; either version 2 of the License, or (at
  10. your option) any later version.
  11.  
  12. This program is distributed in the hope that it will be useful, but
  13. WITHOUT ANY WARRANTY; without even the implied warranty of
  14. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  15. General Public License for more details.
  16.  
  17. You should have received a copy of the GNU General Public License
  18. along with this program; if not, write to the Free Software
  19. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20. */
  21.  
  22. #ifndef SCM_BCHGCC_H
  23. #define SCM_BCHGCC_H
  24.  
  25. #include "config.h"
  26. #include "gccode.h"
  27.  
  28. #ifdef HAVE_SYS_FILE_H
  29. #  include <sys/file.h>
  30. #endif
  31. #ifdef HAVE_FCNTL_H
  32. #  include <fcntl.h>
  33. #endif
  34.  
  35. #ifdef __WIN32__
  36. #  define IO_PAGE_SIZE        4096
  37. #endif
  38. #ifdef __OS2__
  39. #  define IO_PAGE_SIZE        4096
  40. #endif
  41. #ifndef IO_PAGE_SIZE
  42. #  include <sys/param.h>
  43. #endif
  44.  
  45. #ifndef BCH_START_CLOSURE_RELOCATION
  46. #  define BCH_START_CLOSURE_RELOCATION(scan) do { } while (0)
  47. #endif
  48.  
  49. #ifndef BCH_END_CLOSURE_RELOCATION
  50. #  define BCH_END_CLOSURE_RELOCATION(scan) do { } while (0)
  51. #endif
  52.  
  53. #ifndef BCH_EXTRACT_CLOSURE_ENTRY_ADDRESS
  54. #  define BCH_EXTRACT_CLOSURE_ENTRY_ADDRESS EXTRACT_CLOSURE_ENTRY_ADDRESS
  55. #endif
  56.  
  57. #ifndef BCH_STORE_CLOSURE_ENTRY_ADDRESS
  58. #  define BCH_STORE_CLOSURE_ENTRY_ADDRESS STORE_CLOSURE_ENTRY_ADDRESS
  59. #endif
  60.  
  61.  
  62. #ifndef BCH_START_OPERATOR_RELOCATION
  63. #  define BCH_START_OPERATOR_RELOCATION(scan) do { } while (0)
  64. #endif
  65.  
  66. #ifndef BCH_END_OPERATOR_RELOCATION
  67. #  define BCH_END_OPERATOR_RELOCATION(scan) do { } while (0)
  68. #endif
  69.  
  70. #ifndef BCH_EXTRACT_OPERATOR_LINKAGE_ADDRESS
  71. #  define BCH_EXTRACT_OPERATOR_LINKAGE_ADDRESS EXTRACT_OPERATOR_LINKAGE_ADDRESS
  72. #endif
  73.  
  74. #ifndef BCH_STORE_OPERATOR_LINKAGE_ADDRESS
  75. #  define BCH_STORE_OPERATOR_LINKAGE_ADDRESS STORE_OPERATOR_LINKAGE_ADDRESS
  76. #endif
  77.  
  78. extern char * EXFUN (error_name, (int));
  79.  
  80. typedef ssize_t EXFUN (file_operation_t, (int, char *, int));
  81.  
  82. extern int EXFUN (retrying_file_operation,
  83.           (file_operation_t *,
  84.            int, char *, long, long, char *, char *, long *,
  85.            int EXFUN ((*), (char *, char *))));
  86.  
  87. extern int EXFUN (io_error_retry_p, (char *, char *));
  88. extern int EXFUN (io_error_always_abort, (char *, char *));
  89.  
  90. extern char * EXFUN (make_gc_file_name, (CONST char *));
  91. extern int EXFUN (allocate_gc_file, (char *));
  92. extern void EXFUN (protect_gc_file_name, (CONST char *));
  93.  
  94. struct saved_scan_state
  95. {
  96.   SCHEME_OBJECT * virtual_scan_pointer;
  97.   unsigned long scan_position;
  98.   unsigned long scan_offset;
  99. };
  100.  
  101. extern void EXFUN
  102.   (save_scan_state, (struct saved_scan_state * state, SCHEME_OBJECT * scan));
  103. extern SCHEME_OBJECT * EXFUN
  104.   (restore_scan_state, (struct saved_scan_state * state));
  105. extern void EXFUN
  106.   (set_fixed_scan_area, (SCHEME_OBJECT * bottom, SCHEME_OBJECT * top));
  107.  
  108. #ifndef O_BINARY
  109. #  define O_BINARY 0
  110. #endif
  111.  
  112. #define GC_FILE_FLAGS        (O_RDWR | O_CREAT | O_BINARY) /* O_SYNCIO removed */
  113. #define GC_FILE_MASK        0644    /* Everyone reads, owner writes */
  114.  
  115. /* IO_PAGE_SIZE must be a power of 2! */
  116.  
  117. #ifndef IO_PAGE_SIZE
  118. #  ifdef DEV_BSIZE
  119. #    define IO_PAGE_SIZE DEV_BSIZE
  120. #  else
  121. #    define IO_PAGE_SIZE 8192
  122. #  endif
  123. #endif
  124.  
  125. #define ALIGN_DOWN_TO_IO_PAGE(addr)                    \
  126.   (((unsigned long) (addr)) & (~(IO_PAGE_SIZE - 1)))
  127.  
  128. #define ALIGN_UP_TO_IO_PAGE(addr)                    \
  129.   (ALIGN_DOWN_TO_IO_PAGE (((unsigned long) (addr)) + (IO_PAGE_SIZE - 1)))
  130.  
  131. #define ALIGNED_TO_IO_PAGE_P(addr)                    \
  132.   (((unsigned long) (addr)) == (ALIGN_DOWN_TO_IO_PAGE (addr)))
  133.  
  134. extern long
  135.   gc_file_end_position,
  136.   gc_file_current_position,
  137.   gc_file_start_position;
  138.  
  139. extern unsigned long
  140.   gc_buffer_size,
  141.   gc_buffer_bytes,
  142.   gc_buffer_shift,
  143.   gc_buffer_mask,
  144.   gc_buffer_byte_shift;
  145.  
  146. extern char
  147.   gc_death_message_buffer[];
  148.  
  149. extern SCHEME_OBJECT
  150.   * scan_buffer_top,
  151.   * scan_buffer_bottom,
  152.   * free_buffer_top,
  153.   * free_buffer_bottom,
  154.   * weak_pair_stack_ptr,
  155.   * weak_pair_stack_limit,
  156.   * virtual_scan_pointer;
  157.  
  158. typedef enum { NORMAL_GC, PURE_COPY, CONSTANT_COPY } gc_mode_t;
  159.  
  160. extern SCHEME_OBJECT * EXFUN
  161.   (gc_loop, (SCHEME_OBJECT *, SCHEME_OBJECT **, SCHEME_OBJECT **,
  162.          SCHEME_OBJECT *, gc_mode_t, int));
  163.  
  164. extern SCHEME_OBJECT
  165.   * EXFUN (dump_and_reload_scan_buffer, (SCHEME_OBJECT *, Boolean *)),
  166.   * EXFUN (dump_and_reset_free_buffer, (SCHEME_OBJECT *, Boolean *)),
  167.   * EXFUN (dump_free_directly, (SCHEME_OBJECT *, long, Boolean *)),
  168.   * EXFUN (initialize_free_buffer, (void)),
  169.   * EXFUN (initialize_scan_buffer, (SCHEME_OBJECT *)),
  170.   EXFUN (read_newspace_address, (SCHEME_OBJECT *));
  171.  
  172. extern void
  173.   EXFUN (GC, (int)),
  174.   EXFUN (end_transport, (Boolean *)),
  175.   EXFUN (final_reload, (SCHEME_OBJECT *, unsigned long, char *)),
  176.   EXFUN (extend_scan_buffer, (char *, SCHEME_OBJECT *)),
  177.   EXFUN (gc_death, (long, char *, SCHEME_OBJECT *, SCHEME_OBJECT *)),
  178.   EXFUN (restore_gc_file, (void)),
  179.   EXFUN (initialize_weak_pair_transport, (SCHEME_OBJECT *)),
  180.   EXFUN (fix_weak_chain_1, (SCHEME_OBJECT *)),
  181.   EXFUN (fix_weak_chain_2, (void)),
  182.   EXFUN (GC_end_root_relocation, (SCHEME_OBJECT *, SCHEME_OBJECT *));
  183.  
  184. extern long
  185.   EXFUN (GC_relocate_root, (SCHEME_OBJECT **));
  186.  
  187. extern char
  188.   * EXFUN (end_scan_buffer_extension, (char *));
  189.  
  190. extern int
  191.   EXFUN (swap_gc_file, (int));
  192.  
  193. extern Boolean EXFUN (update_allocator_parameters, (SCHEME_OBJECT *));
  194. extern void EXFUN (reset_allocator_parameters, (void));
  195.  
  196. /* Some utility macros */
  197.  
  198. /* These work even when scan/addr point to constant space
  199.    because initialize_free_buffer (in bchmmg.c) cleverly initializes
  200.    scan_buffer_bottom, scan_buffer_top, and virtual_scan_pointer
  201.    so that the operations below do the right thing.
  202.  
  203.    These depend on (scan) and (addr) always pointing past the current
  204.    Scan pointer!
  205.  */
  206.  
  207. #define SCAN_POINTER_TO_NEWSPACE_ADDRESS(scan)                \
  208.   (((char *) virtual_scan_pointer)                    \
  209.    + (((char *) (scan)) - ((char *) scan_buffer_bottom)))
  210.       
  211. #define READ_NEWSPACE_ADDRESS(loc, addr) do                \
  212. {                                    \
  213.   SCHEME_OBJECT * _addr, * _scaddr;                    \
  214.                                     \
  215.   _addr = (addr);                            \
  216.   _scaddr = (scan_buffer_bottom + ((_addr) - virtual_scan_pointer));    \
  217.                                     \
  218.   if ((_scaddr >= scan_buffer_bottom) && (_scaddr < scan_buffer_top))    \
  219.     (loc) = (* _scaddr);                        \
  220.   else if ((_addr >= Constant_Space) && (_addr < Free_Constant))    \
  221.     (loc) = (* _addr);                            \
  222.   else                                    \
  223.     (loc) = (read_newspace_address (_addr));                \
  224. } while (0)
  225.  
  226. #ifdef FLOATING_ALIGNMENT
  227.  
  228. #define BCH_ALIGN_FLOAT(address, pointer)                \
  229. {                                    \
  230.   while (!FLOATING_ALIGNED_P (address))                    \
  231.     {                                    \
  232.       (address) += 1;                            \
  233.       (* ((pointer)++)) = (MAKE_OBJECT (TC_MANIFEST_NM_VECTOR, 0));    \
  234.     }                                    \
  235. }
  236.  
  237. #define BCH_ALIGN_FLOAT_ADDRESS(address)                \
  238. {                                    \
  239.   while (!FLOATING_ALIGNED_P (address))                    \
  240.     (address) += 1;                            \
  241. }
  242.  
  243. #else
  244. #define BCH_ALIGN_FLOAT(address, pointer)
  245. #define BCH_ALIGN_FLOAT_ADDRESS(address)
  246. #endif
  247.  
  248. #endif /* SCM_BCHGCC_H */
  249.