Update of /cvsroot/sbcl/sbcl/src/runtime In directory sc8-pr-cvs1:/tmp/cvs-serv28344/src/runtime Modified Files: Tag: dan_native_threads_branch GNUmakefile alloc.c breakpoint.c dynbind.c gc-common.c gencgc-internal.h gencgc.c interr.c interrupt.c linux-os.c linux-os.h monitor.c print.c purify.c runtime.c search.c thread.c thread.h validate.c validate.h x86-assem.S Log Message: "0.7.9.54.thread.17" #+thats-not-a-thread-its-a-promise To reduce the number of hardcoded offsets to struct thread elements in Lisp, we move the struct thread definition into objdef.lisp But this creates circular dependencies in C-land, where the first half of sbcl.h has #defines that all the other headers depend on, but the second half has structures that depend on all the other headers. So, hack up genesis to write n header files (config.h, constants.h, static-symbols.h, plus one per primitive-object) instead of one. Now we can do some cleanup of the more gross uses of magic numbers in Lisp (debug-int, pseudo-atomic macro, etc) Lost *current-thread* : as a struct thread * it was useless, and as a pid it was unprintable 75% of the time, a native word pid is not a fixnum. Settled the interface for protect_control_stack_guard_page: it takes a pid is_valid_lisp_addr fixed to check all control stacks, not just the first one Parent thread now catches signals from dying children and cleans up after them (see destroy_thread) Index: GNUmakefile =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/GNUmakefile,v retrieving revision 1.14.2.2 retrieving revision 1.14.2.3 diff -u -d -r1.14.2.2 -r1.14.2.3 --- GNUmakefile 11 Dec 2002 00:38:20 -0000 1.14.2.2 +++ GNUmakefile 19 Jan 2003 16:52:01 -0000 1.14.2.3 @@ -60,6 +60,10 @@ TAGS: $(SRCS) etags $(SRCS) +sbcl.h: genesis/*.h + echo '#include "genesis/config.h"' >sbcl.h + echo '#include "genesis/constants.h"' >>sbcl.h + depend: ${C_SRCS} sbcl.h $(CC) ${DEPEND_FLAGS} ${CFLAGS} ${CPPFLAGS} ${C_SRCS} > depend.tmp mv -f depend.tmp depend Index: alloc.c =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/alloc.c,v retrieving revision 1.13.4.1 retrieving revision 1.13.4.2 diff -u -d -r1.13.4.1 -r1.13.4.2 --- alloc.c 16 Jan 2003 17:15:20 -0000 1.13.4.1 +++ alloc.c 19 Jan 2003 16:52:01 -0000 1.13.4.2 @@ -14,15 +14,20 @@ * files for more information. */ +#include <stdio.h> +#include <string.h> + #include "runtime.h" +#include "os.h" #include "sbcl.h" #include "alloc.h" #include "globals.h" #include "gc.h" -#include <stdio.h> -#include <string.h> -#include "runtime.h" #include "thread.h" +#include "genesis/vector.h" +#include "genesis/cons.h" +#include "genesis/bignum.h" +#include "genesis/sap.h" #define GET_FREE_POINTER() dynamic_space_free_pointer #define SET_FREE_POINTER(new_value) \ @@ -38,7 +43,7 @@ lispobj * pa_alloc(int bytes) { - char *result=0; + lispobj *result=0; struct thread *th=arch_os_get_current_thread(); SetSymbolValue(PSEUDO_ATOMIC_INTERRUPTED, make_fixnum(0),th); SetSymbolValue(PSEUDO_ATOMIC_ATOMIC, make_fixnum(1),th); Index: breakpoint.c =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/breakpoint.c,v retrieving revision 1.10.6.1 retrieving revision 1.10.6.2 diff -u -d -r1.10.6.1 -r1.10.6.2 --- breakpoint.c 25 Nov 2002 17:58:36 -0000 1.10.6.1 +++ breakpoint.c 19 Jan 2003 16:52:01 -0000 1.10.6.2 @@ -22,6 +22,8 @@ #include "alloc.h" #include "breakpoint.h" #include "thread.h" +#include "genesis/code.h" +#include "genesis/fdefn.h" #define REAL_LRA_SLOT 0 #ifndef __i386__ Index: dynbind.c =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/dynbind.c,v retrieving revision 1.5.6.3 retrieving revision 1.5.6.4 diff -u -d -r1.5.6.3 -r1.5.6.4 --- dynbind.c 2 Dec 2002 20:00:52 -0000 1.5.6.3 +++ dynbind.c 19 Jan 2003 16:52:01 -0000 1.5.6.4 @@ -18,6 +18,9 @@ #include "globals.h" #include "dynbind.h" #include "thread.h" +#include "genesis/symbol.h" +#include "genesis/binding.h" +#include "genesis/thread.h" #if defined(__i386__) #define GetBSP() ((struct binding *)SymbolValue(BINDING_STACK_POINTER,thread)) Index: gc-common.c =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/gc-common.c,v retrieving revision 1.2 retrieving revision 1.2.4.1 diff -u -d -r1.2 -r1.2.4.1 --- gc-common.c 6 Aug 2002 11:46:32 -0000 1.2 +++ gc-common.c 19 Jan 2003 16:52:01 -0000 1.2.4.1 @@ -52,6 +52,7 @@ #include "lispregs.h" #include "arch.h" #include "gc.h" +#include "primitive-objects.h" #include "gc-internal.h" #ifdef LISP_FEATURE_SPARC Index: gencgc-internal.h =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/gencgc-internal.h,v retrieving revision 1.3.2.1 retrieving revision 1.3.2.2 diff -u -d -r1.3.2.1 -r1.3.2.2 --- gencgc-internal.h 5 Dec 2002 01:38:54 -0000 1.3.2.1 +++ gencgc-internal.h 19 Jan 2003 16:52:02 -0000 1.3.2.2 @@ -20,6 +20,7 @@ #define _GENCGC_INTERNAL_H_ #include "gencgc-alloc-region.h" +#include "genesis/code.h" void gc_free_heap(void); inline int find_page_index(void *); Index: gencgc.c =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/gencgc.c,v retrieving revision 1.24.4.10 retrieving revision 1.24.4.11 diff -u -d -r1.24.4.10 -r1.24.4.11 --- gencgc.c 17 Jan 2003 03:30:31 -0000 1.24.4.10 +++ gencgc.c 19 Jan 2003 16:52:02 -0000 1.24.4.11 @@ -41,6 +41,9 @@ #include "gc.h" #include "gc-internal.h" #include "thread.h" +#include "genesis/vector.h" +#include "genesis/weak-pointer.h" +#include "genesis/simple-fun.h" /* assembly language stub that executes trap_PendingInterrupt */ void do_pending_interrupt(void); Index: interr.c =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/interr.c,v retrieving revision 1.7.6.1 retrieving revision 1.7.6.2 diff -u -d -r1.7.6.1 -r1.7.6.2 --- interr.c 2 Dec 2002 15:57:52 -0000 1.7.6.1 +++ interr.c 19 Jan 2003 16:52:02 -0000 1.7.6.2 @@ -25,6 +25,8 @@ #include "interr.h" #include "print.h" #include "lispregs.h" +#include "genesis/static-symbols.h" +#include "genesis/vector.h" /* the way that we shut down the system on a fatal error */ Index: interrupt.c =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/interrupt.c,v retrieving revision 1.32.4.7 retrieving revision 1.32.4.8 diff -u -d -r1.32.4.7 -r1.32.4.8 --- interrupt.c 17 Jan 2003 03:30:31 -0000 1.32.4.7 +++ interrupt.c 19 Jan 2003 16:52:02 -0000 1.32.4.8 @@ -32,6 +32,8 @@ #include "dynbind.h" #include "interr.h" #include "thread.h" +#include "genesis/fdefn.h" +#include "genesis/simple-fun.h" void sigaddset_blockable(sigset_t *s) { @@ -533,7 +535,7 @@ /* fprintf(stderr, "hit end of control stack\n"); */ /* we hit the end of the control stack. disable protection * temporarily so the error handler has some headroom */ - protect_control_stack_guard_page(th,0L); + protect_control_stack_guard_page(th->pid,0L); fun = (void *) native_pointer((lispobj) SymbolFunction(CONTROL_STACK_EXHAUSTED_ERROR)); Index: linux-os.c =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/linux-os.c,v retrieving revision 1.17.4.2 retrieving revision 1.17.4.3 diff -u -d -r1.17.4.2 -r1.17.4.3 --- linux-os.c 24 Nov 2002 13:14:17 -0000 1.17.4.2 +++ linux-os.c 19 Jan 2003 16:52:02 -0000 1.17.4.3 @@ -229,15 +229,19 @@ boolean is_valid_lisp_addr(os_vm_address_t addr) { - return - in_range_p(addr, READ_ONLY_SPACE_START, READ_ONLY_SPACE_SIZE) || - in_range_p(addr, STATIC_SPACE_START , STATIC_SPACE_SIZE) || - in_range_p(addr, DYNAMIC_SPACE_START , DYNAMIC_SPACE_SIZE) || - /* XXX >1 thread? */ - in_range_p(addr, all_threads->control_stack_start, - THREAD_CONTROL_STACK_SIZE) || - in_range_p(addr, all_threads->binding_stack_start, - BINDING_STACK_SIZE); + struct thread *th; + if(in_range_p(addr, READ_ONLY_SPACE_START, READ_ONLY_SPACE_SIZE) || + in_range_p(addr, STATIC_SPACE_START , STATIC_SPACE_SIZE) || + in_range_p(addr, DYNAMIC_SPACE_START , DYNAMIC_SPACE_SIZE)) + return 1; + for_each_thread(th) { + if(in_range_p(addr, th->control_stack_start, + THREAD_CONTROL_STACK_SIZE) || + in_range_p(addr, th->binding_stack_start, + BINDING_STACK_SIZE)) + return 1; + } + return 0; } /* Index: linux-os.h =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/linux-os.h,v retrieving revision 1.7 retrieving revision 1.7.4.1 diff -u -d -r1.7 -r1.7.4.1 --- linux-os.h 1 Sep 2002 22:34:18 -0000 1.7 +++ linux-os.h 19 Jan 2003 16:52:02 -0000 1.7.4.1 @@ -31,6 +31,7 @@ typedef size_t os_vm_size_t; typedef off_t os_vm_offset_t; typedef int os_vm_prot_t; +typedef pid_t thread_id_t; #define OS_VM_PROT_READ PROT_READ #define OS_VM_PROT_WRITE PROT_WRITE Index: monitor.c =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/monitor.c,v retrieving revision 1.16.6.2 retrieving revision 1.16.6.3 diff -u -d -r1.16.6.2 -r1.16.6.3 --- monitor.c 2 Dec 2002 15:57:53 -0000 1.16.6.2 +++ monitor.c 19 Jan 2003 16:52:02 -0000 1.16.6.3 @@ -34,6 +34,7 @@ #include "lispregs.h" #include "interrupt.h" #include "thread.h" +#include "primitive-objects.h" /* When we need to do command input, we use this stream, which is not * in general stdin, so that things will "work" (as well as being Index: print.c =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/print.c,v retrieving revision 1.12.4.1 retrieving revision 1.12.4.2 diff -u -d -r1.12.4.1 -r1.12.4.2 --- print.c 24 Nov 2002 13:14:17 -0000 1.12.4.1 +++ print.c 19 Jan 2003 16:52:03 -0000 1.12.4.2 @@ -31,6 +31,10 @@ #include "vars.h" #include "os.h" +#include "genesis/static-symbols.h" +#include "gencgc-alloc-region.h" /* genesis/thread.h needs this */ +#include "primitive-objects.h" + static int max_lines = 20, cur_lines = 0; static int max_depth = 5, brief_depth = 2, cur_depth = 0; static int max_length = 5; Index: purify.c =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/purify.c,v retrieving revision 1.20.4.4 retrieving revision 1.20.4.5 diff -u -d -r1.20.4.4 -r1.20.4.5 --- purify.c 11 Dec 2002 00:38:21 -0000 1.20.4.4 +++ purify.c 19 Jan 2003 16:52:03 -0000 1.20.4.5 @@ -29,6 +29,7 @@ #include "gc.h" #include "gc-internal.h" #include "thread.h" +#include "primitive-objects.h" #define PRINTNOISE Index: runtime.c =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/runtime.c,v retrieving revision 1.16.4.6 retrieving revision 1.16.4.7 diff -u -d -r1.16.4.6 -r1.16.4.7 --- runtime.c 16 Jan 2003 17:15:20 -0000 1.16.4.6 +++ runtime.c 19 Jan 2003 16:52:03 -0000 1.16.4.7 @@ -292,11 +292,22 @@ sigemptyset(&sigset); sigaddset(&sigset, SIGCHLD); sigaddset(&sigset, SIGSEGV); + sigaddset(&sigset, SIGTERM); + sigprocmask(SIG_BLOCK,&sigset,0); while(all_threads) { int signal; + siginfo_t info; fprintf(stderr,"parent thread waiting for a signal\n"); - sigwait(&sigset,&signal); - fprintf(stderr,"parent thread got signal %d, maybe_gc_pending=%d\n",signal , maybe_gc_pending); + sigwaitinfo(&sigset,&info); + fprintf(stderr,"parent thread got signal %d %x, maybe_gc_pending=%d\n",info.si_signo ,info.si_code , maybe_gc_pending); + if((info.si_signo==SIGTERM) && + ((info.si_code==CLD_EXITED) || + (info.si_code==CLD_KILLED) || + (info.si_code==CLD_DUMPED))) { + struct thread *th=find_thread_by_pid(info.si_pid); + fprintf(stderr,"need to reap child %d %x\n",info.si_pid,th); + if(th) destroy_thread(th); + } if(maybe_gc_pending) { /* someone asked for a garbage collection */ int pa_thread; Index: search.c =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/search.c,v retrieving revision 1.6 retrieving revision 1.6.6.1 diff -u -d -r1.6 -r1.6.6.1 --- search.c 4 Apr 2002 16:07:51 -0000 1.6 +++ search.c 19 Jan 2003 16:52:03 -0000 1.6.6.1 @@ -15,6 +15,7 @@ #include "sbcl.h" #include "os.h" #include "search.h" +#include "primitive-objects.h" boolean search_for_type(int type, lispobj **start, int *count) { Index: thread.c =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/Attic/thread.c,v retrieving revision 1.1.2.11 retrieving revision 1.1.2.12 diff -u -d -r1.1.2.11 -r1.1.2.12 --- thread.c 17 Jan 2003 03:30:31 -0000 1.1.2.11 +++ thread.c 19 Jan 2003 16:52:03 -0000 1.1.2.12 @@ -27,8 +27,8 @@ /* set go to 0 to stop the thread before it starts. Convenient if you * want to attach a debugger to it before it does anything */ - volatile int go=1; + int new_thread_trampoline(struct thread *th) { @@ -37,9 +37,9 @@ /* wait here until our thread is linked into all_threads: see below */ while(th->pid<1) sched_yield(); - FSHOW((stderr, "/pausing 0x%lx(%d,%d) before new_thread_trampoline(0x%lx)\n", - (unsigned long)th,th->pid,getpid(),(unsigned long)function)); if(go==0) { + FSHOW((stderr, "/pausing 0x%lx(%d,%d) before new_thread_trampoline(0x%lx)\n", + (unsigned long)th,th->pid,getpid(),(unsigned long)function)); while(go==0) ; FSHOW((stderr, "/continue\n")); } @@ -89,9 +89,11 @@ for(i=0;i<(dynamic_values_bytes/sizeof(lispobj));i++) per_thread->dynamic_values[i]=UNBOUND_MARKER_WIDETAG; if(SymbolValue(FREE_TLS_INDEX,0)==UNBOUND_MARKER_WIDETAG) - SetSymbolValue(FREE_TLS_INDEX, - make_fixnum(sizeof(struct thread)/sizeof(lispobj)), - 0); + SetSymbolValue + (FREE_TLS_INDEX, + make_fixnum(MAX_INTERRUPTS+ + sizeof(struct thread)/sizeof(lispobj)), + 0); #define STATIC_TLS_INIT(sym,field) \ ((struct symbol *)(sym-OTHER_POINTER_LOWTAG))->tls_index= \ make_fixnum(THREAD_SLOT_OFFSET_WORDS(field)) @@ -100,10 +102,8 @@ STATIC_TLS_INIT(BINDING_STACK_POINTER,binding_stack_pointer); STATIC_TLS_INIT(CONTROL_STACK_START,control_stack_start); STATIC_TLS_INIT(ALIEN_STACK,alien_stack_pointer); - STATIC_TLS_INIT(CURRENT_THREAD,this); - STATIC_TLS_INIT(PSEUDO_ATOMIC_ATOMIC,pseudo_atomic_atomic); /* FIXME OAOOM: allocation, x86/macros.lisp */ + STATIC_TLS_INIT(PSEUDO_ATOMIC_ATOMIC,pseudo_atomic_atomic); STATIC_TLS_INIT(PSEUDO_ATOMIC_INTERRUPTED,pseudo_atomic_interrupted); - /* FIXME too */ #undef STATIC_TLS_INIT } @@ -129,35 +129,59 @@ bind_variable(CURRENT_CATCH_BLOCK,make_fixnum(0),th); bind_variable(CURRENT_UNWIND_PROTECT_BLOCK,make_fixnum(0),th); - bind_variable(FREE_INTERRUPT_CONTEXT_INDEX,make_fixnum(0),th); + bind_variable(FREE_INTERRUPT_CONTEXT_INDEX,make_fixnum(0),th); bind_variable(INTERRUPT_PENDING, NIL,th); bind_variable(INTERRUPTS_ENABLED,T,th); th->next=all_threads; - protect_control_stack_guard_page(th,1); #if defined(LISP_FEATURE_X86) && defined (LISP_FEATURE_LINUX) th->unbound_marker=initial_function; kid_pid= clone(new_thread_trampoline, (((void*)th->control_stack_start)+THREAD_CONTROL_STACK_SIZE-4), - (((getpid()!=parent_pid)?CLONE_PARENT:0) - |CLONE_SIGHAND|CLONE_VM),th); + (((getpid()!=parent_pid)?(CLONE_SIGHAND|CLONE_PARENT):0) + |SIGTERM|CLONE_VM),th); fprintf(stderr,"child pid is %d\n",kid_pid); if(kid_pid<=0) goto cleanup; #else #error this stuff presently only works on x86 Linux #endif all_threads=th; + /* note that th->pid is 0 at this time. If this function is + * called >once simultaneously, we may end up write-protecting + * one thread twice and the other not at all. That would be bad. + * (Access to this function is supposed to be serialised anyway + * though, for the all_threads manipulation) */ + protect_control_stack_guard_page(th->pid,1); fprintf(stderr,"all_threads,th = 0x%x, 0x%x\n",all_threads,th); th->pid=kid_pid; /* child will not start until this is set */ - return th; + return th->pid; cleanup: /* if(th && th->tls_cookie>=0) os_free_tls_pointer(th); */ if(spaces) os_invalidate(spaces, THREAD_CONTROL_STACK_SIZE+BINDING_STACK_SIZE+ ALIEN_STACK_SIZE+dynamic_values_bytes); return 0; +} + +void destroy_thread (struct thread *th) +{ + /* precondition: the unix task has already been killed and exited. + * This is called by the parent */ + gc_alloc_update_page_tables(0, &th->alloc_region); + if(th==all_threads) + all_threads=th->next; + else { + struct thread *th1=all_threads; + while(th1->next!=th) th1=th1->next; + th1->next=th->next; /* unlink */ + } + /* if(th && th->tls_cookie>=0) os_free_tls_pointer(th); */ + os_invalidate(th->control_stack_start, + THREAD_CONTROL_STACK_SIZE+BINDING_STACK_SIZE+ + ALIEN_STACK_SIZE+dynamic_values_bytes+ + 32*SIGSTKSZ); } Index: thread.h =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/Attic/thread.h,v retrieving revision 1.1.2.9 retrieving revision 1.1.2.10 diff -u -d -r1.1.2.9 -r1.1.2.10 --- thread.h 21 Dec 2002 00:11:09 -0000 1.1.2.9 +++ thread.h 19 Jan 2003 16:52:05 -0000 1.1.2.10 @@ -13,27 +13,13 @@ #else #error "threading doesn't work with cheney gc yet" #endif +#include "genesis/symbol.h" +#include "genesis/static-symbols.h" +#include "genesis/thread.h" #define THREAD_SLOT_OFFSET_WORDS(c) \ (offsetof(struct thread,c)/(sizeof (struct thread *))) -struct thread { - lispobj unbound_marker; /* tls[0] = UNBOUND_MARKER_WIDETAG */ - /* unbound_marker is borrowed very briefly at thread startup to - * pass the address of initial_function into new_thread_trampoline - */ - lispobj *binding_stack_start; - lispobj *binding_stack_pointer; - lispobj *control_stack_start; - lispobj *alien_stack_start; - lispobj *alien_stack_pointer; - struct alloc_region alloc_region; /* 5 words: first 2 are pointer, end */ - os_context_t *interrupt_contexts[MAX_INTERRUPTS]; - pid_t pid; - u32 tls_cookie; /* on x86, the LDT index */ - struct thread *this,*next; - lispobj pseudo_atomic_atomic,pseudo_atomic_interrupted; /* slots 23,24 */ -}; union per_thread_data { struct thread thread; lispobj dynamic_values[1]; /* actually more like 4000 or so */ Index: validate.c =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/validate.c,v retrieving revision 1.13.4.2 retrieving revision 1.13.4.3 diff -u -d -r1.13.4.2 -r1.13.4.3 --- validate.c 18 Dec 2002 17:23:45 -0000 1.13.4.2 +++ validate.c 19 Jan 2003 16:52:06 -0000 1.13.4.3 @@ -85,13 +85,8 @@ #endif } -void protect_control_stack_guard_page(struct thread *th,int protect_p) { - fprintf(stderr, "%sprotecting control stack guard page, th=%x, args %x,%x,%x\n", - protect_p ? "" : "un", th, - CONTROL_STACK_GUARD_PAGE(th), - os_vm_page_size,protect_p ? - (OS_VM_PROT_READ|OS_VM_PROT_EXECUTE) : OS_VM_PROT_ALL); - +void protect_control_stack_guard_page(pid_t t_id, int protect_p) { + struct thread *th= find_thread_by_pid(t_id); os_protect(CONTROL_STACK_GUARD_PAGE(th), os_vm_page_size,protect_p ? (OS_VM_PROT_READ|OS_VM_PROT_EXECUTE) : OS_VM_PROT_ALL); Index: validate.h =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/validate.h,v retrieving revision 1.7.4.2 retrieving revision 1.7.4.3 diff -u -d -r1.7.4.2 -r1.7.4.3 --- validate.h 18 Dec 2002 17:23:45 -0000 1.7.4.2 +++ validate.h 19 Jan 2003 16:52:06 -0000 1.7.4.3 @@ -28,7 +28,7 @@ #endif extern void validate(void); -extern void protect_control_stack_guard_page(struct thread *th,int protect_p); +extern void protect_control_stack_guard_page(pid_t t_id, int protect_p); #endif /* note for anyone trying to port an architecture's support files Index: x86-assem.S =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/x86-assem.S,v retrieving revision 1.9.4.2 retrieving revision 1.9.4.3 diff -u -d -r1.9.4.2 -r1.9.4.3 --- x86-assem.S 5 Dec 2002 01:38:54 -0000 1.9.4.2 +++ x86-assem.S 19 Jan 2003 16:52:06 -0000 1.9.4.3 @@ -16,7 +16,10 @@ #define LANGUAGE_ASSEMBLY #include "validate.h" #include "sbcl.h" - +#include "genesis/closure.h" +#include "genesis/fdefn.h" +#include "genesis/static-symbols.h" + /* Minimize conditionalization for different OS naming schemes. */ #if defined __linux__ || defined __FreeBSD__ /* (but *not* OpenBSD) */ #define GNAME(var) var |