modules: [1/n] introduce ecl_module_gc

We also remove conditionalization for garbage collector inclusion in autotools.
When we propose an alternative gc, then we may decide to put them back, or to
add necessary ifdef statements directly in files.

Moreover untangle c-stack from the gc code and assign the stack base with a
rough guess only when it is not initialized yet (GC will always fill it).

Finally remove a kludge from ecl_adopt_cpu and disable colleciton until the cpu
is fully initialized.
This commit is contained in:
Daniel Kochmański 2024-11-29 21:49:47 +01:00
parent 6f21e51667
commit 6116a83fbb
10 changed files with 339 additions and 334 deletions

3
src/aclocal.m4 vendored
View file

@ -1196,7 +1196,6 @@ if test "${enable_boehm}" = auto -o "${enable_boehm}" = system; then
fi
else
FASL_LIBS="${FASL_LIBS} -lgc"
EXTRA_OBJS="${EXTRA_OBJS} alloc_2.${OBJEXT}"
AC_DEFINE(GBC_BOEHM, [1], [Use Boehm's garbage collector])
fi
fi
@ -1228,7 +1227,6 @@ if test "${enable_boehm}" = "included"; then
ECL_BOEHM_GC_HEADER='ecl/gc/gc.h'
SUBDIRS="${SUBDIRS} gc"
CORE_LIBS="-leclgc ${CORE_LIBS}"
EXTRA_OBJS="${EXTRA_OBJS} alloc_2.${OBJEXT}"
if test "${enable_shared}" = "no"; then
LIBRARIES="${LIBRARIES} ${LIBPREFIX}eclgc.${LIBEXT}"
fi
@ -1304,7 +1302,6 @@ if test "${enable_libffi}" = "included"; then
ECL_LIBFFI_HEADER='ecl/ffi.h'
SUBDIRS="${SUBDIRS} libffi"
CORE_LIBS="-leclffi ${CORE_LIBS}"
EXTRA_OBJS="${EXTRA_OBJS} alloc_2.${OBJEXT}"
if test "${enable_shared}" = "no"; then
LIBRARIES="${LIBRARIES} ${LIBPREFIX}eclffi.${LIBEXT}"
fi

View file

@ -178,6 +178,7 @@ _ecl_alloc_env(cl_env_ptr parent)
output->bds_stack.tl_bindings = NULL;
#endif
output->own_process = ECL_NIL;
output->c_stack.org = NULL;
{
size_t bytes = ecl_core.default_sigmask_bytes;
if (bytes == 0) {
@ -331,9 +332,9 @@ cl_boot(int argc, char **argv)
ARGV = argv;
ecl_self = argv[0];
init_unixint(0);
init_alloc(0);
ecl_add_module(ecl_module_gc);
init_unixint(0);
init_big();
/*
@ -345,6 +346,9 @@ cl_boot(int argc, char **argv)
env = ecl_core.first_env;
ecl_init_first_env(env);
/* We need to enable GC because a lot of stuff is to be created */
ecl_module_gc->module.enable();
/*
* 1) Initialize symbols and packages
*/
@ -450,9 +454,6 @@ cl_boot(int argc, char **argv)
/* These must come _after_ the packages and NIL/T have been created */
init_all_symbols();
/* We need to enable GC because a lot of stuff is to be created */
init_alloc(1);
/* Initialize the handler stack with the exception handler. */
cl_import2(ECL_SIGNAL_HANDLERS, cl_core.system_package);
cl_export2(ECL_SIGNAL_HANDLERS, cl_core.system_package);

View file

@ -1,17 +1,16 @@
/* -*- Mode: C; c-basic-offset: 2; indent-tabs-mode: nil -*- */
/* vim: set filetype=c tabstop=2 shiftwidth=2 expandtab: */
/*
* alloc_2.c - memory allocation based on the Boehm GC
*
* Copyright (c) 2001 Juan Jose Garcia Ripoll
*
* See file 'LICENSE' for the copyright details.
*
*/
/* mem_bdwgc.d - memory allocator and garbage collector based on bdwgc */
/* -- imports ---------------------------------------------------------------- */
#include <ecl/ecl.h>
#include <ecl/ecl-inl.h>
#include <ecl/internal.h>
#include <ecl/external.h>
#include <stdio.h>
#include <ecl/ecl.h>
#ifdef ECL_THREADS
# ifdef ECL_WINDOWS_THREADS
# include <windows.h>
@ -19,21 +18,24 @@
# include <pthread.h>
# endif
#endif
#include <ecl/ecl-inl.h>
#include <ecl/internal.h>
#include <ecl/page.h>
#ifdef ECL_WSOCK
#include <winsock.h>
# include <winsock.h>
#endif
#ifdef GBC_BOEHM
#include <gc/gc_mark.h>
# include <gc/gc_mark.h>
#endif
static void (*GC_old_start_callback)(void) = NULL;
static void gather_statistics(void);
static void update_bytes_consed(void);
static void ecl_mark_env(struct cl_env_struct *env);
#ifdef GBC_BOEHM_PRECISE
# if GBC_BOEHM
# undef GBC_BOEHM_PRECISE
@ -45,9 +47,7 @@ static void **cl_object_free_list;
# endif
#endif
/**********************************************************
* OBJECT ALLOCATION *
**********************************************************/
/* -- object allocation ------------------------------------------------------ */
void
_ecl_set_max_heap_size(size_t new_size)
@ -145,8 +145,7 @@ out_of_memory(size_t requested_bytes)
switch (method) {
case 0: cl_error(1, @'ext::storage-exhausted');
break;
case 1: cl_cerror(2, @"Extend heap size",
@'ext::storage-exhausted');
case 1: cl_cerror(2, @"Extend heap size", @'ext::storage-exhausted');
break;
case 2:
return output;
@ -474,6 +473,56 @@ ecl_dealloc(void *ptr)
ecl_enable_interrupts_env(the_env);
}
/* -- weak pointers ---------------------------------------------------------- */
cl_object
ecl_alloc_weak_pointer(cl_object o)
{
const cl_env_ptr the_env = ecl_process_env();
struct ecl_weak_pointer *obj;
ecl_disable_interrupts_env(the_env);
obj = GC_MALLOC_ATOMIC(sizeof(struct ecl_weak_pointer));
ecl_enable_interrupts_env(the_env);
obj->t = t_weak_pointer;
obj->value = o;
if (!ECL_IMMEDIATE(o)) {
GC_GENERAL_REGISTER_DISAPPEARING_LINK((void**)&(obj->value), (void*)o);
si_set_finalizer((cl_object)obj, ECL_T);
}
return (cl_object)obj;
}
static cl_object
ecl_weak_pointer_value(cl_object o)
{
return ecl_weak_pointer(o);
}
cl_object
si_make_weak_pointer(cl_object o)
{
cl_object pointer = ecl_alloc_weak_pointer(o);
@(return pointer);
}
cl_object
si_weak_pointer_value(cl_object o)
{
const cl_env_ptr the_env = ecl_process_env();
cl_object value;
if (ecl_unlikely(ecl_t_of(o) != t_weak_pointer))
FEwrong_type_only_arg(@[ext::weak-pointer-value], o,
@[ext::weak-pointer]);
value = (cl_object)GC_call_with_alloc_lock((GC_fn_type)ecl_weak_pointer_value, o);
if (value) {
ecl_return2(the_env, value, ECL_T);
} else {
ecl_return2(the_env, ECL_NIL, ECL_NIL);
}
}
/* -- graph traversal -------------------------------------------------------- */
#ifdef GBC_BOEHM_PRECISE
static cl_index
to_bitmap(void *x, void *y)
@ -758,78 +807,7 @@ extern void (*GC_push_other_roots)();
static void (*old_GC_push_other_roots)();
static void stacks_scanner();
void
init_alloc(int pass)
{
if (pass == 1) {
GC_enable();
return;
}
/*
* Garbage collector restrictions: we set up the garbage collector
* library to work as follows
*
* 1) The garbage collector shall not scan shared libraries
* explicitely.
* 2) We only detect objects that are referenced by a pointer to
* the begining or to the first byte.
* 3) Out of the incremental garbage collector, we only use the
* generational component.
* 4) GC should handle fork() which is used to run subprocess on
* some platforms.
*/
GC_set_no_dls(1);
GC_set_all_interior_pointers(0);
GC_set_time_limit(GC_TIME_UNLIMITED);
#ifndef ECL_MS_WINDOWS_HOST
GC_set_handle_fork(1);
#endif
GC_init();
#ifdef ECL_THREADS
# if GC_VERSION_MAJOR > 7 || GC_VERSION_MINOR > 1
GC_allow_register_threads();
# endif
#endif
if (ecl_option_values[ECL_OPT_INCREMENTAL_GC]) {
GC_enable_incremental();
}
GC_register_displacement(1);
GC_clear_roots();
GC_disable();
#ifdef GBC_BOEHM_PRECISE
# ifdef GBC_BOEHM_OWN_MARKER
cl_object_free_list = (void **)GC_new_free_list_inner();
cl_object_mark_proc_index = GC_new_proc((GC_mark_proc)cl_object_mark_proc);
cl_object_kind = GC_new_kind_inner(cl_object_free_list,
GC_MAKE_PROC(cl_object_mark_proc_index, 0),
FALSE, TRUE);
# endif
#endif /* !GBC_BOEHM_PRECISE */
ecl_core.max_heap_size = ecl_option_values[ECL_OPT_HEAP_SIZE];
GC_set_max_heap_size(ecl_core.max_heap_size);
/* Save some memory for the case we get tight. */
if (ecl_core.max_heap_size == 0) {
cl_index size = ecl_option_values[ECL_OPT_HEAP_SAFETY_AREA];
ecl_core.safety_region = ecl_alloc_atomic_unprotected(size);
} else if (ecl_core.safety_region) {
ecl_core.safety_region = 0;
}
init_type_info();
old_GC_push_other_roots = GC_push_other_roots;
GC_push_other_roots = stacks_scanner;
GC_old_start_callback = GC_get_start_callback();
GC_set_start_callback(gather_statistics);
GC_set_java_finalization(1);
GC_set_oom_fn(out_of_memory);
GC_set_warn_proc(no_warnings);
}
/**********************************************************
* FINALIZATION *
**********************************************************/
/* -- finalization ----------------------------------------------------------- */
static void
standard_finalizer(cl_object o)
@ -1066,6 +1044,8 @@ si_set_finalizer(cl_object o, cl_object finalizer)
@(return);
}
/* -- GC stats --------------------------------------------------------------- */
/* If we do not build our own version of the library, we do not have
* control over the existence of this variable. */
#if GBC_BOEHM == 0
@ -1159,9 +1139,7 @@ update_bytes_consed () {
#endif
}
/**********************************************************
* GARBAGE COLLECTOR *
**********************************************************/
/* -- garbage collection ----------------------------------------------------- */
static void
ecl_mark_env(struct cl_env_struct *env)
@ -1176,7 +1154,8 @@ ecl_mark_env(struct cl_env_struct *env)
#ifdef ECL_THREADS
if (env->bds_stack.tl_bindings)
GC_push_all((void *)env->bds_stack.tl_bindings,
(void *)(env->bds_stack.tl_bindings + env->bds_stack.tl_bindings_size));
(void *)(env->bds_stack.tl_bindings
+ env->bds_stack.tl_bindings_size));
#endif
GC_push_all((void *)env, (void *)(env + 1));
}
@ -1210,10 +1189,6 @@ stacks_scanner()
(*old_GC_push_other_roots)();
}
/**********************************************************
* GARBAGE COLLECTION *
**********************************************************/
void
ecl_register_root(cl_object *p)
{
@ -1243,54 +1218,112 @@ si_gc_dump()
@(return);
}
/**********************************************************************
* WEAK POINTERS
*/
/* -- module definition ------------------------------------------------------ */
cl_object
ecl_alloc_weak_pointer(cl_object o)
static cl_object
create_gc()
{
const cl_env_ptr the_env = ecl_process_env();
struct ecl_weak_pointer *obj;
ecl_disable_interrupts_env(the_env);
obj = GC_MALLOC_ATOMIC(sizeof(struct ecl_weak_pointer));
ecl_enable_interrupts_env(the_env);
obj->t = t_weak_pointer;
obj->value = o;
if (!ECL_IMMEDIATE(o)) {
GC_GENERAL_REGISTER_DISAPPEARING_LINK((void**)&(obj->value), (void*)o);
si_set_finalizer((cl_object)obj, ECL_T);
/*
* Garbage collector restrictions: we set up the garbage collector
* library to work as follows
*
* 1) The garbage collector shall not scan shared libraries
* explicitely.
* 2) We only detect objects that are referenced by a pointer to
* the begining or to the first byte.
* 3) Out of the incremental garbage collector, we only use the
* generational component.
* 4) GC should handle fork() which is used to run subprocess on
* some platforms.
*/
GC_set_no_dls(1);
GC_set_all_interior_pointers(0);
GC_set_time_limit(GC_TIME_UNLIMITED);
#ifndef ECL_MS_WINDOWS_HOST
GC_set_handle_fork(1);
#endif
GC_init();
#ifdef ECL_THREADS
# if GC_VERSION_MAJOR > 7 || GC_VERSION_MINOR > 1
GC_allow_register_threads();
# endif
#endif
if (ecl_option_values[ECL_OPT_INCREMENTAL_GC]) {
GC_enable_incremental();
}
return (cl_object)obj;
GC_register_displacement(1);
GC_clear_roots();
GC_disable();
#ifdef GBC_BOEHM_PRECISE
# ifdef GBC_BOEHM_OWN_MARKER
cl_object_free_list = (void **)GC_new_free_list_inner();
cl_object_mark_proc_index = GC_new_proc((GC_mark_proc)cl_object_mark_proc);
cl_object_kind = GC_new_kind_inner(cl_object_free_list,
GC_MAKE_PROC(cl_object_mark_proc_index, 0),
FALSE, TRUE);
# endif
#endif /* !GBC_BOEHM_PRECISE */
ecl_core.max_heap_size = ecl_option_values[ECL_OPT_HEAP_SIZE];
GC_set_max_heap_size(ecl_core.max_heap_size);
/* Save some memory for the case we get tight. */
if (ecl_core.max_heap_size == 0) {
cl_index size = ecl_option_values[ECL_OPT_HEAP_SAFETY_AREA];
ecl_core.safety_region = ecl_alloc_atomic_unprotected(size);
} else if (ecl_core.safety_region) {
ecl_core.safety_region = 0;
}
init_type_info();
old_GC_push_other_roots = GC_push_other_roots;
GC_push_other_roots = stacks_scanner;
GC_old_start_callback = GC_get_start_callback();
GC_set_start_callback(gather_statistics);
GC_set_java_finalization(1);
GC_set_oom_fn(out_of_memory);
GC_set_warn_proc(no_warnings);
return ECL_NIL;
}
static cl_object
ecl_weak_pointer_value(cl_object o)
enable_gc ()
{
return ecl_weak_pointer(o);
GC_enable();
return ECL_NIL;
}
cl_object
si_make_weak_pointer(cl_object o)
static cl_object
disable_gc ()
{
cl_object pointer = ecl_alloc_weak_pointer(o);
@(return pointer);
GC_disable();
return ECL_NIL;
}
cl_object
si_weak_pointer_value(cl_object o)
static cl_object
init_cpu(cl_env_ptr the_env)
{
const cl_env_ptr the_env = ecl_process_env();
cl_object value;
if (ecl_unlikely(ecl_t_of(o) != t_weak_pointer))
FEwrong_type_only_arg(@[ext::weak-pointer-value], o,
@[ext::weak-pointer]);
value = (cl_object)GC_call_with_alloc_lock((GC_fn_type)ecl_weak_pointer_value, o);
if (value) {
ecl_return2(the_env, value, ECL_T);
} else {
ecl_return2(the_env, ECL_NIL, ECL_NIL);
}
#ifdef GBC_BOEHM
struct GC_stack_base stack;
GC_get_stack_base(&stack);
the_env->c_stack.org = (char*)stack.mem_base;
#endif
return ECL_NIL;
}
#endif /* GBC_BOEHM */
ecl_def_ct_base_string(str_gc, "GC", 2, static, const);
static struct ecl_module module_gc = {
.name = str_gc,
.create = create_gc,
.enable = enable_gc,
.init_env = ecl_module_no_op_env,
.init_cpu = init_cpu,
.free_cpu = ecl_module_no_op_cpu,
.free_env = ecl_module_no_op_env,
.disable = disable_gc,
.destroy = ecl_module_no_op
};
cl_object ecl_module_gc = (cl_object)&module_gc;

View file

@ -169,35 +169,18 @@ unregister_gc_thread()
cl_env_ptr
ecl_adopt_cpu()
{
struct cl_env_struct env_aux[1];
struct ecl_interrupt_struct int_aux[1];
cl_env_ptr the_env = ecl_process_env_unsafe();
ecl_thread_t current;
if (the_env != NULL)
return the_env;
/* Ensure that the thread is known to the GC. */
register_gc_thread();
ecl_set_process_self(current);
/* We need a fake env to allow for interrupts blocking and to set up frame
* stacks or other stuff that is needed by ecl_init_env. Since the fake env is
* allocated on the stack, we can safely store pointers to memory allocated by
* the gc there. */
memset(env_aux, 0, sizeof(*env_aux));
env_aux->disable_interrupts = 1;
env_aux->interrupt_struct = int_aux;
env_aux->interrupt_struct->pending_interrupt = ECL_NIL;
ecl_mutex_init(&env_aux->interrupt_struct->signal_queue_lock, FALSE);
env_aux->interrupt_struct->signal_queue = ECL_NIL;
ecl_set_process_env(env_aux);
env_aux->thread = current;
ecl_init_env(env_aux);
/* Allocate, initialize and switch to the real environment. */
the_env = _ecl_alloc_env(0);
memcpy(the_env, env_aux, sizeof(*the_env));
the_env->thread = current;
ecl_set_process_env(the_env);
ecl_init_env(the_env);
add_env(the_env);
init_tl_bindings(ECL_NIL, the_env);
ecl_set_process_env(the_env);
ecl_modules_init_cpu(the_env);
return the_env;
@ -254,7 +237,6 @@ thread_entry_point(void *ptr)
CloseHandle(the_env->thread);
#endif
_ecl_dealloc_env(the_env);
#ifdef ECL_WINDOWS_THREADS
return 1;
#else
@ -354,6 +336,7 @@ init_process(void)
ecl_core.threads = ecl_make_stack(16);
#endif
ecl_set_process_env(the_env);
the_env->c_stack.org = NULL;
the_env->default_sigmask = NULL;
the_env->method_cache = NULL;
the_env->slot_cache = NULL;

View file

@ -33,17 +33,11 @@ ecl_cs_init(cl_env_ptr env)
cl_index margin = ecl_option_values[ECL_OPT_C_STACK_SAFETY_AREA];
cl_index new_size = ecl_option_values[ECL_OPT_C_STACK_SIZE];
cl_index max_size = new_size;
#ifdef GBC_BOEHM
struct GC_stack_base base;
if (GC_get_stack_base(&base) == GC_SUCCESS)
env->c_stack.org = (char*)base.mem_base;
else
if (env->c_stack.org == NULL) {
/* Rough estimate. Not very safe. We assume that cl_boot() is invoked from
* the main() routine of the program. */
env->c_stack.org = (char*)(&env);
#else
/* Rough estimate. Not very safe. We assume that cl_boot() is invoked from the
* main() routine of the program. */
env->c_stack.org = (char*)(&env);
#endif
}
#ifdef ECL_CAN_SET_STACK_SIZE
{
struct rlimit rl;

View file

@ -164,7 +164,9 @@ ecl_import_current_thread(cl_object name, cl_object bindings)
cl_env_ptr the_env;
if (ecl_process_env_unsafe() != NULL)
return 0;
ecl_module_gc->module.disable();
the_env = ecl_adopt_cpu();
ecl_module_gc->module.enable();
ecl_enable_interrupts_env(the_env);
process = alloc_process(name, ECL_NIL);
@ -482,7 +484,6 @@ init_threads()
cl_object process, _env = ecl_cast_ptr(cl_object,the_env);
/* We have to set the environment before any allocation takes place,
* so that the interrupt handling code works. */
ecl_cs_init(the_env);
process = ecl_alloc_object(t_process);
process->process.phase = ECL_PROCESS_ACTIVE;
process->process.name = @'si::top-level';

6
src/configure vendored
View file

@ -7274,8 +7274,6 @@ fi
if test ${enable_boehm} = "no" ; then
as_fn_error $? "Boehm GC library is currently needed to build ECL" "$LINENO" 5;
EXTRA_OBJS="${EXTRA_OBJS} alloc.${OBJEXT} gbc.${OBJEXT}"
enable_smallcons="no"
else
@ -7528,7 +7526,6 @@ printf "%s\n" "${system_boehm} " >&6; }
fi
else
FASL_LIBS="${FASL_LIBS} -lgc"
EXTRA_OBJS="${EXTRA_OBJS} alloc_2.${OBJEXT}"
printf "%s\n" "#define GBC_BOEHM 1" >>confdefs.h
@ -7558,7 +7555,6 @@ printf "%s\n" "$as_me: Configuring included Boehm GC library:" >&6;}
ECL_BOEHM_GC_HEADER='ecl/gc/gc.h'
SUBDIRS="${SUBDIRS} gc"
CORE_LIBS="-leclgc ${CORE_LIBS}"
EXTRA_OBJS="${EXTRA_OBJS} alloc_2.${OBJEXT}"
if test "${enable_shared}" = "no"; then
LIBRARIES="${LIBRARIES} ${LIBPREFIX}eclgc.${LIBEXT}"
fi
@ -7602,6 +7598,7 @@ LSP_FEATURES="${LSP_FEATURES} :boehm-gc"
LSP_FEATURES="${LSP_FEATURES} :ecl-weak-hash"
EXTRA_OBJS="${EXTRA_OBJS} mem_bdwgc.${OBJEXT}"
fi
if test ${enable_smallcons} = "yes" ; then
@ -7715,7 +7712,6 @@ printf "%s\n" "$as_me: Configuring included libffi library:" >&6;}
ECL_LIBFFI_HEADER='ecl/ffi.h'
SUBDIRS="${SUBDIRS} libffi"
CORE_LIBS="-leclffi ${CORE_LIBS}"
EXTRA_OBJS="${EXTRA_OBJS} alloc_2.${OBJEXT}"
if test "${enable_shared}" = "no"; then
LIBRARIES="${LIBRARIES} ${LIBPREFIX}eclffi.${LIBEXT}"
fi

View file

@ -603,12 +603,11 @@ dnl ----------------------------------------------------------------------
dnl Boehm-Weiser garbage collector
if test ${enable_boehm} = "no" ; then
AC_MSG_ERROR([Boehm GC library is currently needed to build ECL]);
EXTRA_OBJS="${EXTRA_OBJS} alloc.${OBJEXT} gbc.${OBJEXT}"
enable_smallcons="no"
else
ECL_BOEHM_GC
ECL_ADD_FEATURE(boehm-gc)
ECL_ADD_FEATURE(ecl-weak-hash)
EXTRA_OBJS="${EXTRA_OBJS} mem_bdwgc.${OBJEXT}"
fi
if test ${enable_smallcons} = "yes" ; then
AC_DEFINE([ECL_SMALL_CONS], [], [ECL_SMALL_CONS])

View file

@ -3,7 +3,7 @@
/* Define if building universal (internal helper macro) */
#undef AC_APPLE_UNIVERSAL_BUILD
/* Define to 1 if the `closedir' function returns void instead of int. */
/* Define to 1 if the 'closedir' function returns void instead of int. */
#undef CLOSEDIR_VOID
/* ECL_AVOID_FPE_H */
@ -85,229 +85,229 @@
/* GBC_BOEHM_PRECISE */
#undef GBC_BOEHM_PRECISE
/* Define to 1 if you have the `alarm' function. */
/* Define to 1 if you have the 'alarm' function. */
#undef HAVE_ALARM
/* Define to 1 if you have the `backtrace' function. */
/* Define to 1 if you have the 'backtrace' function. */
#undef HAVE_BACKTRACE
/* Define to 1 if you have the `backtrace_symbols' function. */
/* Define to 1 if you have the 'backtrace_symbols' function. */
#undef HAVE_BACKTRACE_SYMBOLS
/* Define to 1 if you have the `cabs' function. */
/* Define to 1 if you have the 'cabs' function. */
#undef HAVE_CABS
/* Define to 1 if you have the `cabsf' function. */
/* Define to 1 if you have the 'cabsf' function. */
#undef HAVE_CABSF
/* Define to 1 if you have the `cabsl' function. */
/* Define to 1 if you have the 'cabsl' function. */
#undef HAVE_CABSL
/* Define to 1 if you have the `cacos' function. */
/* Define to 1 if you have the 'cacos' function. */
#undef HAVE_CACOS
/* Define to 1 if you have the `cacosf' function. */
/* Define to 1 if you have the 'cacosf' function. */
#undef HAVE_CACOSF
/* Define to 1 if you have the `cacosh' function. */
/* Define to 1 if you have the 'cacosh' function. */
#undef HAVE_CACOSH
/* Define to 1 if you have the `cacoshf' function. */
/* Define to 1 if you have the 'cacoshf' function. */
#undef HAVE_CACOSHF
/* Define to 1 if you have the `cacoshl' function. */
/* Define to 1 if you have the 'cacoshl' function. */
#undef HAVE_CACOSHL
/* Define to 1 if you have the `cacosl' function. */
/* Define to 1 if you have the 'cacosl' function. */
#undef HAVE_CACOSL
/* Define to 1 if you have the `casin' function. */
/* Define to 1 if you have the 'casin' function. */
#undef HAVE_CASIN
/* Define to 1 if you have the `casinf' function. */
/* Define to 1 if you have the 'casinf' function. */
#undef HAVE_CASINF
/* Define to 1 if you have the `casinh' function. */
/* Define to 1 if you have the 'casinh' function. */
#undef HAVE_CASINH
/* Define to 1 if you have the `casinhf' function. */
/* Define to 1 if you have the 'casinhf' function. */
#undef HAVE_CASINHF
/* Define to 1 if you have the `casinhl' function. */
/* Define to 1 if you have the 'casinhl' function. */
#undef HAVE_CASINHL
/* Define to 1 if you have the `casinl' function. */
/* Define to 1 if you have the 'casinl' function. */
#undef HAVE_CASINL
/* Define to 1 if you have the `catan' function. */
/* Define to 1 if you have the 'catan' function. */
#undef HAVE_CATAN
/* Define to 1 if you have the `catanf' function. */
/* Define to 1 if you have the 'catanf' function. */
#undef HAVE_CATANF
/* Define to 1 if you have the `catanh' function. */
/* Define to 1 if you have the 'catanh' function. */
#undef HAVE_CATANH
/* Define to 1 if you have the `catanhf' function. */
/* Define to 1 if you have the 'catanhf' function. */
#undef HAVE_CATANHF
/* Define to 1 if you have the `catanhl' function. */
/* Define to 1 if you have the 'catanhl' function. */
#undef HAVE_CATANHL
/* Define to 1 if you have the `catanl' function. */
/* Define to 1 if you have the 'catanl' function. */
#undef HAVE_CATANL
/* Define to 1 if you have the `ccos' function. */
/* Define to 1 if you have the 'ccos' function. */
#undef HAVE_CCOS
/* Define to 1 if you have the `ccosf' function. */
/* Define to 1 if you have the 'ccosf' function. */
#undef HAVE_CCOSF
/* Define to 1 if you have the `ccosh' function. */
/* Define to 1 if you have the 'ccosh' function. */
#undef HAVE_CCOSH
/* Define to 1 if you have the `ccoshf' function. */
/* Define to 1 if you have the 'ccoshf' function. */
#undef HAVE_CCOSHF
/* Define to 1 if you have the `ccoshl' function. */
/* Define to 1 if you have the 'ccoshl' function. */
#undef HAVE_CCOSHL
/* Define to 1 if you have the `ccosl' function. */
/* Define to 1 if you have the 'ccosl' function. */
#undef HAVE_CCOSL
/* Define to 1 if you have the `ceilf' function. */
/* Define to 1 if you have the 'ceilf' function. */
#undef HAVE_CEILF
/* Define to 1 if you have the `cexp' function. */
/* Define to 1 if you have the 'cexp' function. */
#undef HAVE_CEXP
/* Define to 1 if you have the `cexpf' function. */
/* Define to 1 if you have the 'cexpf' function. */
#undef HAVE_CEXPF
/* Define to 1 if you have the `cexpl' function. */
/* Define to 1 if you have the 'cexpl' function. */
#undef HAVE_CEXPL
/* Define to 1 if you have the `cimag' function. */
/* Define to 1 if you have the 'cimag' function. */
#undef HAVE_CIMAG
/* Define to 1 if you have the `cimagf' function. */
/* Define to 1 if you have the 'cimagf' function. */
#undef HAVE_CIMAGF
/* Define to 1 if you have the `cimagl' function. */
/* Define to 1 if you have the 'cimagl' function. */
#undef HAVE_CIMAGL
/* Define to 1 if you have the `clock_gettime' function. */
/* Define to 1 if you have the 'clock_gettime' function. */
#undef HAVE_CLOCK_GETTIME
/* Define to 1 if you have the `clog' function. */
/* Define to 1 if you have the 'clog' function. */
#undef HAVE_CLOG
/* Define to 1 if you have the `clogf' function. */
/* Define to 1 if you have the 'clogf' function. */
#undef HAVE_CLOGF
/* Define to 1 if you have the `clogl' function. */
/* Define to 1 if you have the 'clogl' function. */
#undef HAVE_CLOGL
/* Define to 1 if you have the `conj' function. */
/* Define to 1 if you have the 'conj' function. */
#undef HAVE_CONJ
/* Define to 1 if you have the `conjf' function. */
/* Define to 1 if you have the 'conjf' function. */
#undef HAVE_CONJF
/* Define to 1 if you have the `conjl' function. */
/* Define to 1 if you have the 'conjl' function. */
#undef HAVE_CONJL
/* Define to 1 if you have the `copysign' function. */
/* Define to 1 if you have the 'copysign' function. */
#undef HAVE_COPYSIGN
/* Define to 1 if you have the `cosf' function. */
/* Define to 1 if you have the 'cosf' function. */
#undef HAVE_COSF
/* Define to 1 if you have the `coshf' function. */
/* Define to 1 if you have the 'coshf' function. */
#undef HAVE_COSHF
/* Define to 1 if you have the `cpow' function. */
/* Define to 1 if you have the 'cpow' function. */
#undef HAVE_CPOW
/* Define to 1 if you have the `cpowf' function. */
/* Define to 1 if you have the 'cpowf' function. */
#undef HAVE_CPOWF
/* Define to 1 if you have the `cpowl' function. */
/* Define to 1 if you have the 'cpowl' function. */
#undef HAVE_CPOWL
/* Define to 1 if you have the `creal' function. */
/* Define to 1 if you have the 'creal' function. */
#undef HAVE_CREAL
/* Define to 1 if you have the `crealf' function. */
/* Define to 1 if you have the 'crealf' function. */
#undef HAVE_CREALF
/* Define to 1 if you have the `creall' function. */
/* Define to 1 if you have the 'creall' function. */
#undef HAVE_CREALL
/* Define to 1 if you have the `csin' function. */
/* Define to 1 if you have the 'csin' function. */
#undef HAVE_CSIN
/* Define to 1 if you have the `csinf' function. */
/* Define to 1 if you have the 'csinf' function. */
#undef HAVE_CSINF
/* Define to 1 if you have the `csinh' function. */
/* Define to 1 if you have the 'csinh' function. */
#undef HAVE_CSINH
/* Define to 1 if you have the `csinhf' function. */
/* Define to 1 if you have the 'csinhf' function. */
#undef HAVE_CSINHF
/* Define to 1 if you have the `csinhl' function. */
/* Define to 1 if you have the 'csinhl' function. */
#undef HAVE_CSINHL
/* Define to 1 if you have the `csinl' function. */
/* Define to 1 if you have the 'csinl' function. */
#undef HAVE_CSINL
/* Define to 1 if you have the `csqrt' function. */
/* Define to 1 if you have the 'csqrt' function. */
#undef HAVE_CSQRT
/* Define to 1 if you have the `csqrtf' function. */
/* Define to 1 if you have the 'csqrtf' function. */
#undef HAVE_CSQRTF
/* Define to 1 if you have the `csqrtl' function. */
/* Define to 1 if you have the 'csqrtl' function. */
#undef HAVE_CSQRTL
/* Define to 1 if you have the `ctan' function. */
/* Define to 1 if you have the 'ctan' function. */
#undef HAVE_CTAN
/* Define to 1 if you have the `ctanf' function. */
/* Define to 1 if you have the 'ctanf' function. */
#undef HAVE_CTANF
/* Define to 1 if you have the `ctanh' function. */
/* Define to 1 if you have the 'ctanh' function. */
#undef HAVE_CTANH
/* Define to 1 if you have the `ctanhf' function. */
/* Define to 1 if you have the 'ctanhf' function. */
#undef HAVE_CTANHF
/* Define to 1 if you have the `ctanhl' function. */
/* Define to 1 if you have the 'ctanhl' function. */
#undef HAVE_CTANHL
/* Define to 1 if you have the `ctanl' function. */
/* Define to 1 if you have the 'ctanl' function. */
#undef HAVE_CTANL
/* Define to 1 if you have the <dirent.h> header file. */
#undef HAVE_DIRENT_H
/* Define to 1 if you have the `dladdr' function. */
/* Define to 1 if you have the 'dladdr' function. */
#undef HAVE_DLADDR
/* Define to 1 if you have the <dlfcn.h> header file. */
#undef HAVE_DLFCN_H
/* Define to 1 if the system has the type `double complex'. */
/* Define to 1 if the system has the type 'double complex'. */
#undef HAVE_DOUBLE_COMPLEX
/* HAVE_ENVIRON */
#undef HAVE_ENVIRON
/* Define to 1 if you have the `expf' function. */
/* Define to 1 if you have the 'expf' function. */
#undef HAVE_EXPF
/* Define to 1 if you have the `fabsf' function. */
/* Define to 1 if you have the 'fabsf' function. */
#undef HAVE_FABSF
/* Define to 1 if you have the <fcntl.h> header file. */
@ -319,61 +319,61 @@
/* Define to 1 if you have the <fenv.h> header file. */
#undef HAVE_FENV_H
/* Define to 1 if the system has the type `float complex'. */
/* Define to 1 if the system has the type 'float complex'. */
#undef HAVE_FLOAT_COMPLEX
/* Define to 1 if you have the <float.h> header file. */
#undef HAVE_FLOAT_H
/* Define to 1 if you have the `floor' function. */
/* Define to 1 if you have the 'floor' function. */
#undef HAVE_FLOOR
/* Define to 1 if you have the `floorf' function. */
/* Define to 1 if you have the 'floorf' function. */
#undef HAVE_FLOORF
/* Define to 1 if you have the `fork' function. */
/* Define to 1 if you have the 'fork' function. */
#undef HAVE_FORK
/* Define to 1 if you have the `frexpf' function. */
/* Define to 1 if you have the 'frexpf' function. */
#undef HAVE_FREXPF
/* Define to 1 if you have the `fseeko' function. */
/* Define to 1 if you have the 'fseeko' function. */
#undef HAVE_FSEEKO
/* Define to 1 if you have the `getcwd' function. */
/* Define to 1 if you have the 'getcwd' function. */
#undef HAVE_GETCWD
/* Define to 1 if you have the `gethostbyaddr' function. */
/* Define to 1 if you have the 'gethostbyaddr' function. */
#undef HAVE_GETHOSTBYADDR
/* Define to 1 if you have the `gethostbyname' function. */
/* Define to 1 if you have the 'gethostbyname' function. */
#undef HAVE_GETHOSTBYNAME
/* Define to 1 if you have the `getpagesize' function. */
/* Define to 1 if you have the 'getpagesize' function. */
#undef HAVE_GETPAGESIZE
/* Define to 1 if you have the `getrusage' function. */
/* Define to 1 if you have the 'getrusage' function. */
#undef HAVE_GETRUSAGE
/* Define to 1 if you have the `gettimeofday' function. */
/* Define to 1 if you have the 'gettimeofday' function. */
#undef HAVE_GETTIMEOFDAY
/* Define to 1 if you have the <inttypes.h> header file. */
#undef HAVE_INTTYPES_H
/* Define to 1 if you have the `isatty' function. */
/* Define to 1 if you have the 'isatty' function. */
#undef HAVE_ISATTY
/* Define to 1 if you have the `ldexpf' function. */
/* Define to 1 if you have the 'ldexpf' function. */
#undef HAVE_LDEXPF
/* HAVE_LIBFFI */
#undef HAVE_LIBFFI
/* Define to 1 if you have the `gc' library (-lgc). */
/* Define to 1 if you have the 'gc' library (-lgc). */
#undef HAVE_LIBGC
/* Define to 1 if you have the `sun' library (-lsun). */
/* Define to 1 if you have the 'sun' library (-lsun). */
#undef HAVE_LIBSUN
/* Define to 1 if you have the <limits.h> header file. */
@ -382,50 +382,50 @@
/* Define to 1 if you have the <link.h> header file. */
#undef HAVE_LINK_H
/* Define to 1 if you have the `log1p' function. */
/* Define to 1 if you have the 'log1p' function. */
#undef HAVE_LOG1P
/* Define to 1 if you have the `log1pf' function. */
/* Define to 1 if you have the 'log1pf' function. */
#undef HAVE_LOG1PF
/* Define to 1 if you have the `log1pl' function. */
/* Define to 1 if you have the 'log1pl' function. */
#undef HAVE_LOG1PL
/* Define to 1 if you have the `logf' function. */
/* Define to 1 if you have the 'logf' function. */
#undef HAVE_LOGF
/* Define to 1 if the system has the type `long complex'. */
/* Define to 1 if the system has the type 'long complex'. */
#undef HAVE_LONG_COMPLEX
/* Define to 1 if you have the `lstat' function. */
/* Define to 1 if you have the 'lstat' function. */
#undef HAVE_LSTAT
/* Define to 1 if you have the <mach-o/dyld.h> header file. */
#undef HAVE_MACH_O_DYLD_H
/* Define to 1 if your system has a GNU libc compatible `malloc' function, and
/* Define to 1 if your system has a GNU libc compatible 'malloc' function, and
to 0 otherwise. */
#undef HAVE_MALLOC
/* Define to 1 if you have the `memmove' function. */
/* Define to 1 if you have the 'memmove' function. */
#undef HAVE_MEMMOVE
/* Define to 1 if you have the `memset' function. */
/* Define to 1 if you have the 'memset' function. */
#undef HAVE_MEMSET
/* Define to 1 if you have the `mkdir' function. */
/* Define to 1 if you have the 'mkdir' function. */
#undef HAVE_MKDIR
/* Define to 1 if you have the `mkstemp' function. */
/* Define to 1 if you have the 'mkstemp' function. */
#undef HAVE_MKSTEMP
/* Define to 1 if you have a working `mmap' system call. */
/* Define to 1 if you have a working 'mmap' system call. */
#undef HAVE_MMAP
/* Define to 1 if you have the `nanosleep' function. */
/* Define to 1 if you have the 'nanosleep' function. */
#undef HAVE_NANOSLEEP
/* Define to 1 if you have the <ndir.h> header file, and it defines `DIR'. */
/* Define to 1 if you have the <ndir.h> header file, and it defines 'DIR'. */
#undef HAVE_NDIR_H
/* Define to 1 if you have the <netdb.h> header file. */
@ -437,62 +437,62 @@
/* HAVE_POSIX_RWLOCK */
#undef HAVE_POSIX_RWLOCK
/* Define to 1 if you have the `powf' function. */
/* Define to 1 if you have the 'powf' function. */
#undef HAVE_POWF
/* Define to 1 if you have the `pthread_condattr_setclock' function. */
/* Define to 1 if you have the 'pthread_condattr_setclock' function. */
#undef HAVE_PTHREAD_CONDATTR_SETCLOCK
/* Define to 1 if you have the `pthread_mutex_timedlock' function. */
/* Define to 1 if you have the 'pthread_mutex_timedlock' function. */
#undef HAVE_PTHREAD_MUTEX_TIMEDLOCK
/* Define to 1 if the system has the type `pthread_rwlock_t'. */
/* Define to 1 if the system has the type 'pthread_rwlock_t'. */
#undef HAVE_PTHREAD_RWLOCK_T
/* Define to 1 if the system has the type `ptrdiff_t'. */
/* Define to 1 if the system has the type 'ptrdiff_t'. */
#undef HAVE_PTRDIFF_T
/* Define to 1 if you have the `putenv' function. */
/* Define to 1 if you have the 'putenv' function. */
#undef HAVE_PUTENV
/* Define to 1 if you have the <pwd.h> header file. */
#undef HAVE_PWD_H
/* Define to 1 if your system has a GNU libc compatible `realloc' function,
/* Define to 1 if your system has a GNU libc compatible 'realloc' function,
and to 0 otherwise. */
#undef HAVE_REALLOC
/* Define to 1 if you have the <sched.h> header file. */
#undef HAVE_SCHED_H
/* Define to 1 if you have the `sched_yield' function. */
/* Define to 1 if you have the 'sched_yield' function. */
#undef HAVE_SCHED_YIELD
/* Define to 1 if you have the `select' function. */
/* Define to 1 if you have the 'select' function. */
#undef HAVE_SELECT
/* Define to 1 if you have the `setenv' function. */
/* Define to 1 if you have the 'setenv' function. */
#undef HAVE_SETENV
/* Define to 1 if you have the `sigprocmask' function. */
/* Define to 1 if you have the 'sigprocmask' function. */
#undef HAVE_SIGPROCMASK
/* Define to 1 if you have the `sinf' function. */
/* Define to 1 if you have the 'sinf' function. */
#undef HAVE_SINF
/* Define to 1 if you have the `sinhf' function. */
/* Define to 1 if you have the 'sinhf' function. */
#undef HAVE_SINHF
/* Define to 1 if you have the `socket' function. */
/* Define to 1 if you have the 'socket' function. */
#undef HAVE_SOCKET
/* Define to 1 if you have the `sqrt' function. */
/* Define to 1 if you have the 'sqrt' function. */
#undef HAVE_SQRT
/* Define to 1 if you have the `sqrtf' function. */
/* Define to 1 if you have the 'sqrtf' function. */
#undef HAVE_SQRTF
/* Define to 1 if `stat' has the bug that it succeeds when given the
/* Define to 1 if 'stat' has the bug that it succeeds when given the
zero-length file name argument. */
#undef HAVE_STAT_EMPTY_STRING_BUG
@ -511,13 +511,13 @@
/* Define to 1 if you have the <stdlib.h> header file. */
#undef HAVE_STDLIB_H
/* Define to 1 if you have the `strcasecmp' function. */
/* Define to 1 if you have the 'strcasecmp' function. */
#undef HAVE_STRCASECMP
/* Define to 1 if you have the `strchr' function. */
/* Define to 1 if you have the 'strchr' function. */
#undef HAVE_STRCHR
/* Define to 1 if you have the `strerror' function. */
/* Define to 1 if you have the 'strerror' function. */
#undef HAVE_STRERROR
/* Define to 1 if you have the <strings.h> header file. */
@ -526,13 +526,13 @@
/* Define to 1 if you have the <string.h> header file. */
#undef HAVE_STRING_H
/* Define to 1 if you have the `strtol' function. */
/* Define to 1 if you have the 'strtol' function. */
#undef HAVE_STRTOL
/* Define to 1 if you have the `system' function. */
/* Define to 1 if you have the 'system' function. */
#undef HAVE_SYSTEM
/* Define to 1 if you have the <sys/dir.h> header file, and it defines `DIR'.
/* Define to 1 if you have the <sys/dir.h> header file, and it defines 'DIR'.
*/
#undef HAVE_SYS_DIR_H
@ -542,7 +542,7 @@
/* HAVE_SYS_MMAN_H */
#undef HAVE_SYS_MMAN_H
/* Define to 1 if you have the <sys/ndir.h> header file, and it defines `DIR'.
/* Define to 1 if you have the <sys/ndir.h> header file, and it defines 'DIR'.
*/
#undef HAVE_SYS_NDIR_H
@ -573,28 +573,28 @@
/* Define to 1 if you have the <sys/wait.h> header file. */
#undef HAVE_SYS_WAIT_H
/* Define to 1 if you have the `tanf' function. */
/* Define to 1 if you have the 'tanf' function. */
#undef HAVE_TANF
/* Define to 1 if you have the `tanhf' function. */
/* Define to 1 if you have the 'tanhf' function. */
#undef HAVE_TANHF
/* Define to 1 if you have the `times' function. */
/* Define to 1 if you have the 'times' function. */
#undef HAVE_TIMES
/* Define to 1 if you have the `tzset' function. */
/* Define to 1 if you have the 'tzset' function. */
#undef HAVE_TZSET
/* Define to 1 if you have the <ulimit.h> header file. */
#undef HAVE_ULIMIT_H
/* Define to 1 if you have the `uname' function. */
/* Define to 1 if you have the 'uname' function. */
#undef HAVE_UNAME
/* Define to 1 if you have the <unistd.h> header file. */
#undef HAVE_UNISTD_H
/* Define to 1 if you have the `vfork' function. */
/* Define to 1 if you have the 'vfork' function. */
#undef HAVE_VFORK
/* Define to 1 if you have the <vfork.h> header file. */
@ -603,16 +603,16 @@
/* Define to 1 if you have the <wchar.h> header file. */
#undef HAVE_WCHAR_H
/* Define to 1 if `fork' works. */
/* Define to 1 if 'fork' works. */
#undef HAVE_WORKING_FORK
/* Define to 1 if `vfork' works. */
/* Define to 1 if 'vfork' works. */
#undef HAVE_WORKING_VFORK
/* Define to 1 if the system has the type `_Bool'. */
/* Define to 1 if the system has the type '_Bool'. */
#undef HAVE__BOOL
/* Define to 1 if `lstat' dereferences a symlink specified with a trailing
/* Define to 1 if 'lstat' dereferences a symlink specified with a trailing
slash. */
#undef LSTAT_FOLLOWS_SLASHED_SYMLINK
@ -634,19 +634,19 @@
/* Define to the version of this package. */
#undef PACKAGE_VERSION
/* Define as the return type of signal handlers (`int' or `void'). */
/* Define as the return type of signal handlers ('int' or 'void'). */
#undef RETSIGTYPE
/* Define to the type of arg 1 for `select'. */
/* Define to the type of arg 1 for 'select'. */
#undef SELECT_TYPE_ARG1
/* Define to the type of args 2, 3 and 4 for `select'. */
/* Define to the type of args 2, 3 and 4 for 'select'. */
#undef SELECT_TYPE_ARG234
/* Define to the type of arg 5 for `select'. */
/* Define to the type of arg 5 for 'select'. */
#undef SELECT_TYPE_ARG5
/* Define to 1 if all of the C90 standard headers exist (not just the ones
/* Define to 1 if all of the C89 standard headers exist (not just the ones
required in a freestanding environment). This macro is provided for
backward compatibility; new code need not use it. */
#undef STDC_HEADERS
@ -655,7 +655,7 @@
macro is obsolete. */
#undef TIME_WITH_SYS_TIME
/* Define to 1 if your <sys/time.h> declares `struct tm'. */
/* Define to 1 if your <sys/time.h> declares 'struct tm'. */
#undef TM_IN_SYS_TIME
/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
@ -685,7 +685,7 @@
#define below would cause a syntax error. */
#undef _UINT8_T
/* Define to empty if `const' does not conform to ANSI C. */
/* Define to empty if 'const' does not conform to ANSI C. */
#undef const
/* ecl_int16_t */
@ -718,7 +718,7 @@
/* compiler understands long long */
#undef ecl_ulong_long_t
/* Define to `__inline__' or `__inline' if that's what the C compiler
/* Define to '__inline__' or '__inline' if that's what the C compiler
calls it, or to nothing if 'inline' is not supported under any name. */
#ifndef __cplusplus
#undef inline
@ -749,7 +749,7 @@
/* Define to rpl_realloc if the replacement function should be used. */
#undef realloc
/* Define to `unsigned int' if <sys/types.h> does not define. */
/* Define as 'unsigned int' if <stddef.h> doesn't define. */
#undef size_t
/* Define to the type of an unsigned integer type of width exactly 16 bits if
@ -768,9 +768,9 @@
such a type exists and the standard includes do not define it. */
#undef uint8_t
/* Define as `fork' if `vfork' does not work. */
/* Define as 'fork' if 'vfork' does not work. */
#undef vfork
/* Define to empty if the keyword `volatile' does not work. Warning: valid
code using `volatile' can become incorrect without. Disable with care. */
/* Define to empty if the keyword 'volatile' does not work. Warning: valid
code using 'volatile' can become incorrect without. Disable with care. */
#undef volatile

View file

@ -24,16 +24,13 @@ extern "C" {
/* booting */
extern void init_all_symbols(void);
extern void init_alloc(int pass);
extern void init_backq(void);
extern void init_big();
extern void init_clos(void);
extern void init_error(void);
extern void init_eval(void);
extern void init_file(void);
#ifndef GBC_BOEHM
extern void init_GC(void);
#endif
extern void init_gc(void);
extern void init_macros(void);
extern void init_read(void);
@ -56,7 +53,7 @@ extern void free_modules(void);
extern cl_env_ptr _ecl_alloc_env(cl_env_ptr parent);
extern void _ecl_dealloc_env(cl_env_ptr);
/* alloc.d/alloc_2.d */
/* mem_bdwgc.d */
#ifdef GBC_BOEHM
#define ECL_COMPACT_OBJECT_EXTRA(x) ((void*)((x)->array.displaced))
@ -66,6 +63,10 @@ extern cl_object ecl_alloc_bytecodes(cl_index data_size, cl_index code_size);
extern cl_index ecl_object_byte_size(cl_type t);
extern cl_index ecl_next_stamp();
/* modules.c */
extern ECL_API cl_object ecl_module_dummy;
extern ECL_API cl_object ecl_module_gc;
/* array.d */
#ifdef ECL_DEFINE_AET_SIZE