From ded744f74ab2f1a97679ad4f91e0eb8d995daef2 Mon Sep 17 00:00:00 2001
From: William Harold Newman <william.newman@airmail.net>
Date: Fri, 20 Feb 2004 18:15:10 +0000
Subject: [PATCH] 0.8.7.57: 	merged Brian Mastenbrook's "SBCL-on-Darwin
 state" patch 		(sbcl-devel 2004-02-18)

---
 contrib/asdf-install/installer.lisp |    3 +-
 make-target-1.sh                    |    6 ++++
 src/runtime/Config.ppc-darwin       |   30 ++++++++++++++++--
 src/runtime/GNUmakefile             |    2 +-
 src/runtime/breakpoint.c            |    2 +-
 src/runtime/bsd-os.c                |   10 +++---
 src/runtime/bsd-os.h                |    2 +-
 src/runtime/coreparse.c             |    2 +-
 src/runtime/globals.h               |    2 +-
 src/runtime/interr.c                |    2 +-
 src/runtime/interrupt.c             |    9 +++++-
 src/runtime/monitor.c               |    2 +-
 src/runtime/os-common.c             |    1 +
 src/runtime/ppc-arch.c              |   11 +++++++
 src/runtime/ppc-assem.S             |   22 ++++++-------
 src/runtime/ppc-darwin-mkrospace.c  |   58 +++++++++++++++++++++++++++++++++++
 src/runtime/ppc-darwin-os.c         |    2 +-
 src/runtime/ppc-lispregs.h          |    4 +--
 src/runtime/purify.c                |    2 +-
 src/runtime/save.c                  |    2 +-
 src/runtime/validate.c              |    2 +-
 src/runtime/vars.c                  |    1 +
 version.lisp-expr                   |    2 +-
 23 files changed, 145 insertions(+), 34 deletions(-)
 create mode 100644 src/runtime/ppc-darwin-mkrospace.c

diff --git a/contrib/asdf-install/installer.lisp b/contrib/asdf-install/installer.lisp
index c85e947..d17d7e1 100644
--- a/contrib/asdf-install/installer.lisp
+++ b/contrib/asdf-install/installer.lisp
@@ -249,7 +249,8 @@
   (let* ((tar
 	  (with-output-to-string (o)
 	    (or
-	     (sb-ext:run-program "tar"
+	     (sb-ext:run-program #-darwin "tar"
+				 #+darwin "gnutar"
 				 (list "-C" (namestring source)
 				       "-xzvf" (namestring packagename))
 				 :output o
diff --git a/make-target-1.sh b/make-target-1.sh
index d0bdbd0..8256384 100644
--- a/make-target-1.sh
+++ b/make-target-1.sh
@@ -35,3 +35,9 @@ cd tools-for-build
 $GNUMAKE -I../src/runtime grovel-headers || exit 1
 cd ..
 tools-for-build/grovel-headers > output/stuff-groveled-from-headers.lisp
+
+# after-grovel-headers may not exist for all platforms (used for
+# Darwin hacks)
+cd src/runtime
+$GNUMAKE after-grovel-headers || true
+cd ..
diff --git a/src/runtime/Config.ppc-darwin b/src/runtime/Config.ppc-darwin
index a208c5d..8f8cc2e 100644
--- a/src/runtime/Config.ppc-darwin
+++ b/src/runtime/Config.ppc-darwin
@@ -1,9 +1,9 @@
 # -*- makefile -*-
-CFLAGS = -DDARWIN -Dppc -g -Wall -O3 -no-cpp-precomp
+CFLAGS = -Dppc -g -Wall -O3 -no-cpp-precomp
 OS_SRC = bsd-os.c os-common.c ppc-darwin-os.c ppc-darwin-dlshim.c
 OS_LIBS = -lSystem -lc -lm
 
-# Avoid the dreaded gcc 3.3 prerelease tarpit of death!
+# Avoid the gcc 3.3 prerelease tarpit of death!
 CC = gcc3
 
 ASSEM_SRC = ppc-assem.S ldso-stubs.S
@@ -11,7 +11,31 @@ ARCH_SRC = ppc-arch.c
 
 CPP = cpp -no-cpp-precomp
 
-OS_LINK_FLAGS = -dynamic -L$(HOME)/local/lib -L/sw/lib -L/opt/local/lib -L/usr/local/lib
+# FIXME - "-Wl,-segaddr,SBCLRO,0x1000000" is output from
+# ppc-darwin-mkrospace (it depends on READ_ONLY_SPACE I believe) but it
+# is hard-coded here!
+OS_LINK_FLAGS = -dynamic -L$(HOME)/local/lib -L/sw/lib -L/opt/local/lib -L/usr/local/lib -Wl,-segaddr,SBCLRO,0x1000000 -Wl,-seg1addr,0x5000000 $(if $(AFTER_GROVEL_HEADERS),ppc-darwin-rospace.o)
 
 GC_SRC= cheneygc.c
 
+CLEAN_FILES += ppc-darwin-mkrospace
+
+ppc-darwin-mkrospace: ppc-darwin-mkrospace.c
+	$(CC) -o $@ $<
+
+ppc-darwin-rospace.o: ppc-darwin-mkrospace
+	./ppc-darwin-mkrospace
+
+.PHONY: after-grovel-headers
+
+# Rebuild the sbcl runtime to avoid Panther placing the heap where
+# it wants read only space (in the first 32 megabytes, where it
+# can be absolute-branched to with BA.)  Must be done after 
+# grovel-headers, because Apple's nm is broken.
+after-grovel-headers: ppc-darwin-rospace.o
+	rm -f sbcl
+	$(GNUMAKE) sbcl AFTER_GROVEL_HEADERS=1
+
+# Fortunatly make-target-1.sh does a make clean all the time.
+# Otherwise we would have to make sure that sbcl gets rebuilt without
+# the readonlyspace hack before groveling headers again.
diff --git a/src/runtime/GNUmakefile b/src/runtime/GNUmakefile
index 1c5ae15..b147ca9 100644
--- a/src/runtime/GNUmakefile
+++ b/src/runtime/GNUmakefile
@@ -55,7 +55,7 @@ sbcl: ${OBJS}
 
 .PHONY: clean all
 clean:
-	-rm -f depend *.o sbcl sbcl.nm core *.tmp
+	-rm -f depend *.o sbcl sbcl.nm core *.tmp $(CLEAN_FILES)
 
 TAGS: $(SRCS)
 	etags $(SRCS)
diff --git a/src/runtime/breakpoint.c b/src/runtime/breakpoint.c
index 878ada4..439354d 100644
--- a/src/runtime/breakpoint.c
+++ b/src/runtime/breakpoint.c
@@ -12,9 +12,9 @@
 #include <stdio.h>
 #include <signal.h>
 
+#include "sbcl.h"
 #include "runtime.h"
 #include "os.h"
-#include "sbcl.h"
 #include "interrupt.h"
 #include "arch.h"
 #include "lispregs.h"
diff --git a/src/runtime/bsd-os.c b/src/runtime/bsd-os.c
index f31f5fc..e758d2e 100644
--- a/src/runtime/bsd-os.c
+++ b/src/runtime/bsd-os.c
@@ -21,6 +21,7 @@
 #include <stdio.h>
 #include <sys/param.h>
 #include <sys/file.h>
+#include "sbcl.h"
 #include "./signal.h"
 #include "os.h"
 #include "arch.h"
@@ -28,7 +29,6 @@
 #include "interrupt.h"
 #include "interr.h"
 #include "lispregs.h"
-#include "sbcl.h"
 #include "thread.h"
 
 #include <sys/types.h>
@@ -50,7 +50,7 @@ int *os_context_pc_addr(os_context_t *context)
     return CONTEXT_ADDR_FROM_STEM(eip);
 #elif defined __OpenBSD__
     return CONTEXT_ADDR_FROM_STEM(pc);
-#elif defined DARWIN
+#elif defined LISP_FEATURE_DARWIN
     return &context->uc_mcontext->ss.srr0;
 #else
 #error unsupported BSD variant
@@ -63,7 +63,7 @@ os_context_sigmask_addr(os_context_t *context)
     /* (Unlike most of the other context fields that we access, the
      * signal mask field is a field of the basic, outermost context
      * struct itself both in FreeBSD 4.0 and in OpenBSD 2.6.) */
-#if defined __FreeBSD__ || defined DARWIN
+#if defined __FreeBSD__ || defined LISP_FEATURE_DARWIN
     return &context->uc_sigmask;
 #elif defined __OpenBSD__
     return &context->sc_mask;
@@ -166,7 +166,7 @@ memory_fault_handler(int signal, siginfo_t *siginfo, void *void_context)
     void *fault_addr = siginfo->si_addr;
 #elif defined __OpenBSD__
     void *fault_addr = siginfo->si_addr;
-#elif defined DARWIN
+#elif defined LISP_FEATURE_DARWIN
     void *fault_addr = siginfo->si_addr;
 #else
 #error unsupported BSD variant
@@ -200,6 +200,8 @@ sigsegv_handler(int signal, siginfo_t *info, void* void_context)
     if(!interrupt_maybe_gc(signal, info, context))
 	if(!handle_control_stack_guard_triggered(context,addr))
 	    interrupt_handle_now(signal, info, context);
+    /* Work around G5 bug; fix courtesy gbyers */
+    sigreturn(void_context);
 }
 
 void
diff --git a/src/runtime/bsd-os.h b/src/runtime/bsd-os.h
index d95431d..f7c3e1c 100644
--- a/src/runtime/bsd-os.h
+++ b/src/runtime/bsd-os.h
@@ -48,7 +48,7 @@ typedef ucontext_t os_context_t;
 #elif defined __OpenBSD__
 typedef struct sigcontext os_context_t;
 #define SIG_MEMORY_FAULT SIGSEGV
-#elif defined DARWIN
+#elif defined LISP_FEATURE_DARWIN
   /* man pages claim that the third argument is a sigcontext struct,
      but ucontext_t is defined, matches sigcontext where sensible,
      offers better access to mcontext, and is of course the SUSv2-
diff --git a/src/runtime/coreparse.c b/src/runtime/coreparse.c
index 6ac74ba..e01bf33 100644
--- a/src/runtime/coreparse.c
+++ b/src/runtime/coreparse.c
@@ -26,13 +26,13 @@
 #include <fcntl.h>
 #endif
 
+#include "sbcl.h"
 #include "os.h"
 #include "runtime.h"
 #include "globals.h"
 #include "core.h"
 #include "arch.h"
 #include "interr.h"
-#include "sbcl.h"
 #include "thread.h"
 
 unsigned char build_id[] =
diff --git a/src/runtime/globals.h b/src/runtime/globals.h
index 2064f6f..8991729 100644
--- a/src/runtime/globals.h
+++ b/src/runtime/globals.h
@@ -59,7 +59,7 @@ extern void globals_init(void);
 #endif
 #endif
 #ifdef ppc
-#ifdef DARWIN
+#ifdef LISP_FEATURE_DARWIN
 #define EXTERN(name,bytes) .globl _/**/name
 #else
 #define EXTERN(name,bytes) .globl name 
diff --git a/src/runtime/interr.c b/src/runtime/interr.c
index 7de06f0..5734ac1 100644
--- a/src/runtime/interr.c
+++ b/src/runtime/interr.c
@@ -17,11 +17,11 @@
 #include <stdarg.h>
 #include <stdlib.h>
 
+#include "sbcl.h"
 #include "arch.h"
 #include "signal.h"
 
 #include "runtime.h"
-#include "sbcl.h"
 #include "interr.h"
 #include "print.h"
 #include "lispregs.h"
diff --git a/src/runtime/interrupt.c b/src/runtime/interrupt.c
index 9bc28ac..7f26e76 100644
--- a/src/runtime/interrupt.c
+++ b/src/runtime/interrupt.c
@@ -48,9 +48,9 @@
 #include <sys/types.h>
 #include <sys/wait.h>
 
+#include "sbcl.h"
 #include "runtime.h"
 #include "arch.h"
-#include "sbcl.h"
 #include "os.h"
 #include "interrupt.h"
 #include "globals.h"
@@ -536,6 +536,10 @@ maybe_now_maybe_later(int signal, siginfo_t *info, void *void_context)
 			   signal,info,context))
 	return;
     interrupt_handle_now(signal, info, context);
+#ifdef LISP_FEATURE_DARWIN
+    /* Work around G5 bug */
+    sigreturn(void_context);
+#endif
 }
 
 #ifdef LISP_FEATURE_SB_THREAD
@@ -575,6 +579,9 @@ interrupt_handle_now_handler(int signal, siginfo_t *info, void *void_context)
 {
     os_context_t *context = arch_os_get_context(&void_context);
     interrupt_handle_now(signal, info, context);
+#ifdef LISP_FEATURE_DARWIN
+    sigreturn(void_context);
+#endif
 }
 
 /*
diff --git a/src/runtime/monitor.c b/src/runtime/monitor.c
index 9bddfec..cae927b 100644
--- a/src/runtime/monitor.c
+++ b/src/runtime/monitor.c
@@ -326,7 +326,7 @@ print_context(os_context_t *context)
 	brief_print((lispobj)(*os_context_register_addr(context,i)));
 #endif
     }
-#ifdef DARWIN
+#ifdef LISP_FEATURE_DARWIN
     printf("DAR:\t\t 0x%08lx\n", (unsigned long)(*os_context_register_addr(context, 41)));
     printf("DSISR:\t\t 0x%08lx\n", (unsigned long)(*os_context_register_addr(context, 42)));
 #endif
diff --git a/src/runtime/os-common.c b/src/runtime/os-common.c
index 3becd18..dce4613 100644
--- a/src/runtime/os-common.c
+++ b/src/runtime/os-common.c
@@ -13,6 +13,7 @@
 #include <errno.h>
 #include <strings.h>
 
+#include "sbcl.h"
 #include "os.h"
 #include "interr.h"
 
diff --git a/src/runtime/ppc-arch.c b/src/runtime/ppc-arch.c
index f62739e..aa8a522 100644
--- a/src/runtime/ppc-arch.c
+++ b/src/runtime/ppc-arch.c
@@ -1,5 +1,6 @@
 #include <stdio.h>
 
+#include "sbcl.h"
 #include "arch.h"
 #include "sbcl.h"
 #include "globals.h"
@@ -185,14 +186,24 @@ sigtrap_handler(int signal, siginfo_t *siginfo, os_context_t *context)
 	    interrupt_handle_now(signal, code, context);
 	    break;
 	}
+#ifdef LISP_FEATURE_DARWIN
+	sigreturn(context);
+#endif
 	return;
     }
     if (((code >> 26) == 3) && (((code >> 21) & 31) == 24)) {
 	interrupt_internal_error(signal, code, context, 0);
+#ifdef LISP_FEATURE_DARWIN
+	sigreturn(context);
+#endif
 	return;
     }
     
     interrupt_handle_now(signal, code, context);
+#ifdef LISP_FEATURE_DARWIN
+    /* Work around G5 bug */
+    sigreturn(context);
+#endif
 }
 
 
diff --git a/src/runtime/ppc-assem.S b/src/runtime/ppc-assem.S
index de36538..afd0b1c 100644
--- a/src/runtime/ppc-assem.S
+++ b/src/runtime/ppc-assem.S
@@ -9,13 +9,13 @@
 #include "genesis/closure.h"
 #include "genesis/static-symbols.h"
 
-#ifdef DARWIN
+#ifdef LISP_FEATURE_DARWIN
 #define CSYMBOL(x) _ ## x
 #else
 #define CSYMBOL(x) x
 #endif
 
-#if defined DARWIN
+#if defined LISP_FEATURE_DARWIN
 #define FUNCDEF(x)	.text @ \
 			.align 3 @ \
 _##x:
@@ -32,7 +32,7 @@ x:
 	FUNCDEF(x)
 #endif
 
-#if defined DARWIN
+#if defined LISP_FEATURE_DARWIN
 #define SET_SIZE(x)
 #else
 #define SET_SIZE(x) .size x,.-x
@@ -41,7 +41,7 @@ x:
 /* Load a register from a global, using the register as an intermediary */
 /* The register will be a fixnum for one instruction, so this is gc-safe */
 
-#if defined DARWIN
+#if defined LISP_FEATURE_DARWIN
 #define load(reg,global) \
 	lis reg,ha16(global) @ \
 	lwz reg,lo16(global)(reg) ; Comment
@@ -56,7 +56,7 @@ x:
 #endif
 	
 #define	FIRST_SAVE_FPR	14	/* lowest-numbered non-volatile FPR */
-#ifdef DARWIN
+#ifdef LISP_FEATURE_DARWIN
 #define	FIRST_SAVE_GPR	13	/* lowest-numbered non-volatile GPR */
 #define NGPR_SAVE_BYTES(n) ((32-(n))*4)
 #define FRAME_ARG_BYTES(n)  (((((n)+6)*4)+15)&~15)
@@ -67,7 +67,7 @@ x:
 #endif
 #define	NFPR_SAVE_BYTES(n) ((32-(n))*8)
 
-#ifdef DARWIN
+#ifdef LISP_FEATURE_DARWIN
 #define FRAME_SIZE(first_g,first_f,out_arg_words,savecr) \
 (NFPR_SAVE_BYTES(first_f)+ NGPR_SAVE_BYTES(first_g)+ FRAME_ARG_BYTES(out_arg_words))
 #define SAVE_FPR(n) stfd f##n,-8*(32- n)(r11)
@@ -86,7 +86,7 @@ x:
 #define RESTORE_GPR(n) lwz n,-4*(32-(n))(11)
 #endif
 
-#ifdef DARWIN
+#ifdef LISP_FEATURE_DARWIN
 #define C_FULL_PROLOG \
 	nop @\
 	nop @ \
@@ -302,7 +302,7 @@ x:
 	li reg_L1,0
 	li reg_L2,0
 	li reg_LIP,0
-#ifdef DARWIN	
+#ifdef LISP_FEATURE_DARWIN	
 	lis reg_NULL,hi16(NIL)
 	ori reg_NULL,reg_NULL,lo16(NIL)
 #else
@@ -334,7 +334,7 @@ x:
 	lwz reg_A3,12(reg_CFP)
 
 	/* Calculate LRA */
-#ifdef DARWIN
+#ifdef LISP_FEATURE_DARWIN
 	lis reg_LRA,ha16(lra)
 	addi reg_LRA,reg_LRA,lo16(lra)
 #else
@@ -436,7 +436,7 @@ lra:
 	twlti reg_ALLOC,0
 	mr reg_NL3,reg_NARGS
 
-#ifdef DARWIN
+#ifdef LISP_FEATURE_DARWIN
 	/* PowerOpen (i.e. OS X) requires the callee address in r12
            (a.k.a. CFUNC), so move it back there, too. */
 	mfctr reg_CFUNC
@@ -445,7 +445,7 @@ lra:
 	bctrl
 
 	/* Re-establish NIL */
-#ifdef DARWIN
+#ifdef LISP_FEATURE_DARWIN
 	lis reg_NULL,hi16(NIL)
 	ori reg_NULL,reg_NULL,lo16(NIL)
 #else
diff --git a/src/runtime/ppc-darwin-mkrospace.c b/src/runtime/ppc-darwin-mkrospace.c
new file mode 100644
index 0000000..8faf381
--- /dev/null
+++ b/src/runtime/ppc-darwin-mkrospace.c
@@ -0,0 +1,58 @@
+/* ppc-darwin-mkrospace.c - write a .o which makes sure we get our desired address range */
+
+#include <stdlib.h>
+#include <string.h>
+#include <mach-o/loader.h>
+#include <sys/types.h>
+#include <sys/uio.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include "runtime.h"
+#include "sbcl.h"
+
+struct simple_object_file
+{
+  struct mach_header theheader;
+  struct segment_command thesegment;
+  struct section thesection;
+};
+
+int main(int argc, char** argv)
+{
+  struct simple_object_file *theobj;
+  int fd;
+  theobj = (struct simple_object_file*) malloc(sizeof(struct simple_object_file));
+  theobj->theheader.magic = MH_MAGIC;
+  theobj->theheader.cputype = CPU_TYPE_POWERPC;
+  theobj->theheader.cpusubtype = CPU_SUBTYPE_POWERPC_ALL;
+  theobj->theheader.filetype = MH_OBJECT;
+  theobj->theheader.ncmds = 1;
+  theobj->theheader.sizeofcmds = sizeof(struct segment_command) + sizeof(struct section);
+  theobj->theheader.flags = MH_NOUNDEFS;
+  theobj->thesegment.cmd = LC_SEGMENT;
+  theobj->thesegment.cmdsize = sizeof(struct segment_command) + sizeof(struct section);
+  memcpy(theobj->thesegment.segname, "", sizeof(char));
+  theobj->thesegment.fileoff = sizeof(struct mach_header);
+  theobj->thesegment.vmaddr = READ_ONLY_SPACE_START;
+  theobj->thesegment.vmsize = READ_ONLY_SPACE_END - READ_ONLY_SPACE_START;
+  theobj->thesegment.maxprot = VM_PROT_ALL;
+  theobj->thesegment.initprot = VM_PROT_ALL;
+  theobj->thesegment.nsects = 1;
+  theobj->thesegment.flags = 0;
+  memcpy(theobj->thesection.sectname, "core", 5);
+  memcpy(theobj->thesection.segname, "SBCLRO", 7);
+  theobj->thesection.addr = READ_ONLY_SPACE_START;
+  theobj->thesection.size = READ_ONLY_SPACE_END - READ_ONLY_SPACE_START;
+  theobj->thesection.offset = sizeof(struct mach_header) + sizeof(struct segment_command) + sizeof(struct section);
+  theobj->thesection.align = 0;
+  theobj->thesection.reloff = 0;
+  theobj->thesection.nreloc = 0;
+  theobj->thesection.flags = S_ZEROFILL | S_REGULAR | S_ATTR_SOME_INSTRUCTIONS;
+  theobj->thesection.reserved1 = 0;
+  theobj->thesection.reserved2 = 0;
+  fd = open("ppc-darwin-rospace.o", O_WRONLY | O_CREAT, 0644);
+  write(fd, theobj, sizeof(struct simple_object_file));
+  close(fd);
+  printf("-Wl,-segaddr,SBCLRO,0x%x\n",READ_ONLY_SPACE_START);
+  return 0;
+}
diff --git a/src/runtime/ppc-darwin-os.c b/src/runtime/ppc-darwin-os.c
index ba1060f..7bf1346 100644
--- a/src/runtime/ppc-darwin-os.c
+++ b/src/runtime/ppc-darwin-os.c
@@ -14,7 +14,7 @@
  * files for more information.
  */
 
-
+#include "sbcl.h"
 #include "globals.h"
 #include <signal.h>
 #include <ucontext.h>
diff --git a/src/runtime/ppc-lispregs.h b/src/runtime/ppc-lispregs.h
index e47791b..817a9ae 100644
--- a/src/runtime/ppc-lispregs.h
+++ b/src/runtime/ppc-lispregs.h
@@ -1,4 +1,4 @@
-#if defined DARWIN
+#if defined LISP_FEATURE_DARWIN
 #if defined LANGUAGE_ASSEMBLY
 #define REG(num) r##num
 #else
@@ -22,7 +22,7 @@
 #define reg_NL6       REG(9) 	/* Last (7th) FF param */
 #define reg_FDEFN     REG(10)   /* was NL7 until recently -dan */
 #define reg_NARGS     REG(11)
-#ifdef DARWIN
+#ifdef LISP_FEATURE_DARWIN
 #define reg_CFUNC     REG(12)	/* Silly to blow a reg on FF-name */
 #define reg_NFP       REG(13)	/* Lisp may save around FF-call */
 #else
diff --git a/src/runtime/purify.c b/src/runtime/purify.c
index 9e8159a..2d87694 100644
--- a/src/runtime/purify.c
+++ b/src/runtime/purify.c
@@ -19,9 +19,9 @@
 #include <strings.h>
 #include <errno.h>
 
+#include "sbcl.h"
 #include "runtime.h"
 #include "os.h"
-#include "sbcl.h"
 #include "globals.h"
 #include "validate.h"
 #include "interrupt.h"
diff --git a/src/runtime/save.c b/src/runtime/save.c
index c8c152f..e901d98 100644
--- a/src/runtime/save.c
+++ b/src/runtime/save.c
@@ -14,9 +14,9 @@
 #include <signal.h>
 #include <sys/file.h>
 
+#include "sbcl.h"
 #include "runtime.h"
 #include "os.h"
-#include "sbcl.h"
 #include "core.h"
 #include "globals.h"
 #include "save.h"
diff --git a/src/runtime/validate.c b/src/runtime/validate.c
index d88d17d..aa0890f 100644
--- a/src/runtime/validate.c
+++ b/src/runtime/validate.c
@@ -16,10 +16,10 @@
 #include <stdio.h>
 #include <stdlib.h>
 
+#include "sbcl.h"
 #include "runtime.h"
 #include "os.h"
 #include "globals.h"
-#include "sbcl.h"
 #include "validate.h"
 
 static void
diff --git a/src/runtime/vars.c b/src/runtime/vars.c
index 8786ee7..5f36ef1 100644
--- a/src/runtime/vars.c
+++ b/src/runtime/vars.c
@@ -14,6 +14,7 @@
 #include <sys/types.h>
 #include <stdlib.h>
 
+#include "sbcl.h"
 #include "runtime.h"
 #include "vars.h"
 #include "os.h"
diff --git a/version.lisp-expr b/version.lisp-expr
index f8bb7d6..c2a8ea3 100644
--- a/version.lisp-expr
+++ b/version.lisp-expr
@@ -17,4 +17,4 @@
 ;;; checkins which aren't released. (And occasionally for internal
 ;;; versions, especially for internal versions off the main CVS
 ;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".)
-"0.8.7.56"
+"0.8.7.57"
-- 
1.7.10.4