Date: Monday, December 13, 2010 @ 23:25:11 Author: rtoy Path: /project/cmucl/cvsroot/src Tag: cross-sol-x86-branch
Added: lisp/Config.x86_solaris_sunc tools/cross-scripts/cross-x86-osx-solaris.lisp Modified: compiler/x86/parms.lisp lisp/Config.sparc_common lisp/Config.sparc_sunc lisp/interrupt.c lisp/solaris-os.c lisp/sunos-os.h lisp/x86-assem.S lisp/x86-validate.h
First cut at a build for Solaris/x86. Result doesn't work; it gets as far as TYPE-INIT, but then crashes.
These changes still allow solaris/sparc and darwin/x86 to build, so we haven't broken both sparc and x86 while doing this.
tools/cross-scripts/cross-x86-osx-solaris.lisp: o New cross-compile script to use darwin/x86 to cross-compile to solaris/x86.
compiler/x86/parms.lisp: o For now, put thel linkage space start at 0xc0000000 on Solaris/x86.
lisp/Config.sparc_common: o Separate out the common parts between Solaris sparc and x86. Move the different parts into the appropriate file.
lisp/Config.sparc_sunc: o Add ASSEM_SRC and ARCH_SRC here, with the appropriate OS_SRC, OS_LINK_FLAGS, and OS_LIBS>
lisp/Config.x86_solaris_sunc: o New file for building solaris/x86 using Sun C (aka Sun Studio aka Solaris Studio)
lisp/interrupt.c: o Use a static array for the altstack. Should eventually do what other x86 platforms do.
lisp/solaris-os.c: o Don't need os_flush_icache on x86 (?), so make the body empty for x86. o Add x86 version of os_sigcontext_reg and os_sigcontext_pc.
lisp/sunos-os.h: o The pagesize is 4096 on x86 instead of 8192. o Don't need (?) SAVE_CONTEXT.
lisp/x86-assem.S: o Update to support Sun C assembler: - Add appropriate GNAME, FUNCDEF and ENDFUNC macros. - Sun assembler doesn't have int3 instruction, so add INT3 macro to do the appropriate things. - Sun assembler doesn't like control L characters in the file so remove them.
lisp/x86-validate.h: o Add entry for Solaris. This needs work, but it looks like these values will work.
------------------------------------------------+ compiler/x86/parms.lisp | 5 lisp/Config.sparc_common | 8 lisp/Config.sparc_sunc | 7 lisp/Config.x86_solaris_sunc | 14 + lisp/interrupt.c | 6 lisp/solaris-os.c | 37 +++ lisp/sunos-os.h | 8 lisp/x86-assem.S | 61 +++-- lisp/x86-validate.h | 31 ++- tools/cross-scripts/cross-x86-osx-solaris.lisp | 236 +++++++++++++++++++++++ 10 files changed, 378 insertions(+), 35 deletions(-)
Index: src/compiler/x86/parms.lisp diff -u src/compiler/x86/parms.lisp:1.41 src/compiler/x86/parms.lisp:1.41.2.1 --- src/compiler/x86/parms.lisp:1.41 Sat Dec 4 12:32:34 2010 +++ src/compiler/x86/parms.lisp Mon Dec 13 23:25:11 2010 @@ -7,7 +7,7 @@ ;;; Scott Fahlman or slisp-group@cs.cmu.edu. ;;; (ext:file-comment - "$Header: /project/cmucl/cvsroot/src/compiler/x86/parms.lisp,v 1.41 2010-12-04 17:32:34 rtoy Exp $") + "$Header: /project/cmucl/cvsroot/src/compiler/x86/parms.lisp,v 1.41.2.1 2010-12-14 04:25:11 rtoy Exp $") ;;; ;;; ********************************************************************** ;;; @@ -65,7 +65,8 @@
(setf (c::backend-foreign-linkage-space-start *target-backend*) #+linux #x58000000 - #-linux #xB0000000 + #+solaris #xC0000000 + #-(or linux solaris) #xB0000000 (c::backend-foreign-linkage-entry-size *target-backend*) 8) ); eval-when Index: src/lisp/Config.sparc_common diff -u src/lisp/Config.sparc_common:1.3 src/lisp/Config.sparc_common:1.3.6.1 --- src/lisp/Config.sparc_common:1.3 Wed Jul 28 21:51:12 2010 +++ src/lisp/Config.sparc_common Mon Dec 13 23:25:11 2010 @@ -38,11 +38,11 @@ CFLAGS = -g $(CC_V8PLUS)
NM = $(PATH1)/solaris-nm -ASSEM_SRC = sparc-assem.S -ARCH_SRC = sparc-arch.c +#ASSEM_SRC = sparc-assem.S +#ARCH_SRC = sparc-arch.c
DEPEND=$(CC) -OS_SRC = solaris-os.c os-common.c undefineds.c elf.c k_rem_pio2.c +#OS_SRC = solaris-os.c os-common.c undefineds.c elf.c k_rem_pio2.c OS_LINK_FLAGS= -OS_LIBS= -lsocket -lnsl -ldl +#OS_LIBS= -lsocket -lnsl -ldl EXEC_FINAL_OBJ = exec-final.o Index: src/lisp/Config.sparc_sunc diff -u src/lisp/Config.sparc_sunc:1.2 src/lisp/Config.sparc_sunc:1.2.12.1 --- src/lisp/Config.sparc_sunc:1.2 Mon Feb 1 11:41:39 2010 +++ src/lisp/Config.sparc_sunc Mon Dec 13 23:25:11 2010 @@ -20,6 +20,13 @@ AS_V8PLUS = -m32 -xarch=sparc endif
+ASSEM_SRC = sparc-assem.S +ARCH_SRC = sparc-arch.c + +OS_SRC = solaris-os.c os-common.c undefineds.c elf.c k_rem_pio2.c +OS_LINK_FLAGS= +OS_LIBS= -lsocket -lnsl -ldl + CC = cc -xlibmieee -O CPP = cc -E DEPEND_FLAGS = -xM Index: src/lisp/Config.x86_solaris_sunc diff -u /dev/null src/lisp/Config.x86_solaris_sunc:1.1.2.1 --- /dev/null Mon Dec 13 23:25:11 2010 +++ src/lisp/Config.x86_solaris_sunc Mon Dec 13 23:25:11 2010 @@ -0,0 +1,14 @@ +# -*- Mode: makefile -*- +include Config.sparc_common + +CC = cc -xlibmieee -g +CFLAGS += -Di386 +CPP = cc -E +DEPEND_FLAGS = -xM + +ASSEM_SRC = x86-assem.S +ARCH_SRC = x86-arch.c + +OS_SRC = solaris-os.c os-common.c undefineds.c elf.c e_rem_pio2.c k_rem_pio2.c +OS_LINK_FLAGS= +OS_LIBS= -lsocket -lnsl -ldl Index: src/lisp/interrupt.c diff -u src/lisp/interrupt.c:1.60 src/lisp/interrupt.c:1.60.12.1 --- src/lisp/interrupt.c:1.60 Mon Nov 2 10:05:07 2009 +++ src/lisp/interrupt.c Mon Dec 13 23:25:11 2010 @@ -1,4 +1,4 @@ -/* $Header: /project/cmucl/cvsroot/src/lisp/interrupt.c,v 1.60 2009-11-02 15:05:07 rtoy Rel $ */ +/* $Header: /project/cmucl/cvsroot/src/lisp/interrupt.c,v 1.60.12.1 2010-12-14 04:25:11 rtoy Exp $ */
/* Interrupt handling magic. */
@@ -396,7 +396,7 @@ * Noise to install handlers. * ****************************************************************/
-#if !(defined(i386) || defined(__x86_64)) +#if defined(SOLARIS) || !(defined(i386) || defined(__x86_64)) #define SIGNAL_STACK_SIZE SIGSTKSZ static char altstack[SIGNAL_STACK_SIZE]; #endif @@ -422,7 +422,7 @@ if (signal == PROTECTION_VIOLATION_SIGNAL) { stack_t sigstack;
-#if (defined( i386 ) || defined(__x86_64)) +#if !defined(SOLARIS) && (defined( i386 ) || defined(__x86_64)) sigstack.ss_sp = (void *) SIGNAL_STACK_START; #else sigstack.ss_sp = (void *) altstack; Index: src/lisp/solaris-os.c diff -u src/lisp/solaris-os.c:1.26 src/lisp/solaris-os.c:1.26.4.1 --- src/lisp/solaris-os.c:1.26 Fri Nov 12 07:57:32 2010 +++ src/lisp/solaris-os.c Mon Dec 13 23:25:11 2010 @@ -1,5 +1,5 @@ /* - * $Header: /project/cmucl/cvsroot/src/lisp/solaris-os.c,v 1.26 2010-11-12 12:57:32 rtoy Exp $ + * $Header: /project/cmucl/cvsroot/src/lisp/solaris-os.c,v 1.26.4.1 2010-12-14 04:25:11 rtoy Exp $ * * OS-dependent routines. This file (along with os.h) exports an * OS-independent interface to the operating system VM facilities. @@ -138,6 +138,7 @@ void os_flush_icache(os_vm_address_t address, os_vm_size_t length) { +#ifndef i386 static int flushit = -1;
/* @@ -158,6 +159,7 @@ fprintf(stderr, ";;;iflush %p - %lx\n", (void *) address, length); flush_icache((unsigned int *) address, length); } +#endif }
void @@ -492,3 +494,36 @@
return sym_addr; } + +#ifdef i386 +unsigned long * +os_sigcontext_reg(ucontext_t *scp, int index) +{ + switch (index) { + case 0: + return (unsigned long *) &scp->uc_mcontext.gregs[EAX]; + case 2: + return (unsigned long *) &scp->uc_mcontext.gregs[ECX]; + case 4: + return (unsigned long *) &scp->uc_mcontext.gregs[EDX]; + case 6: + return (unsigned long *) &scp->uc_mcontext.gregs[EBX]; + case 8: + return (unsigned long *) &scp->uc_mcontext.gregs[ESP]; + case 10: + return (unsigned long *) &scp->uc_mcontext.gregs[EBP]; + case 12: + return (unsigned long *) &scp->uc_mcontext.gregs[ESI]; + case 14: + return (unsigned long *) &scp->uc_mcontext.gregs[EDI]; + } + return NULL; +} + +unsigned long * +os_sigcontext_pc(ucontext_t *scp) +{ + return (unsigned long *) &scp->uc_mcontext.gregs[EIP]; +} + +#endif Index: src/lisp/sunos-os.h diff -u src/lisp/sunos-os.h:1.13 src/lisp/sunos-os.h:1.13.32.1 --- src/lisp/sunos-os.h:1.13 Mon Mar 17 23:58:45 2008 +++ src/lisp/sunos-os.h Mon Dec 13 23:25:11 2010 @@ -1,6 +1,6 @@ /*
- $Header: /project/cmucl/cvsroot/src/lisp/sunos-os.h,v 1.13 2008-03-18 03:58:45 cshapiro Rel $ + $Header: /project/cmucl/cvsroot/src/lisp/sunos-os.h,v 1.13.32.1 2010-12-14 04:25:11 rtoy Exp $
This code was written as part of the CMU Common Lisp project at Carnegie Mellon University, and has been placed in the public domain. @@ -42,13 +42,19 @@ #define OS_VM_PROT_WRITE PROT_WRITE #define OS_VM_PROT_EXECUTE PROT_EXEC
+#ifdef i386 +#define OS_VM_DEFAULT_PAGESIZE 4096 +#else #define OS_VM_DEFAULT_PAGESIZE 8192 +#endif
#ifdef SOLARIS #include <ucontext.h> #define HANDLER_ARGS int signal, siginfo_t *code, struct ucontext *context #define CODE(code) ((code) ? code->si_code : 0) +#ifndef i386 #define SAVE_CONTEXT() save_context() +#endif
#ifdef NULL #undef NULL Index: src/lisp/x86-assem.S diff -u src/lisp/x86-assem.S:1.34 src/lisp/x86-assem.S:1.34.6.1 --- src/lisp/x86-assem.S:1.34 Mon Jul 19 19:08:37 2010 +++ src/lisp/x86-assem.S Mon Dec 13 23:25:11 2010 @@ -1,6 +1,6 @@ -### x86-assem.S -*- Mode: Asm; -*- +/* ### x86-assem.S -*- Mode: Asm; -*- */ /** - * $Header: /project/cmucl/cvsroot/src/lisp/x86-assem.S,v 1.34 2010-07-19 23:08:37 rtoy Rel $ + * $Header: /project/cmucl/cvsroot/src/lisp/x86-assem.S,v 1.34.6.1 2010-12-14 04:25:11 rtoy Exp $ * * Authors: Paul F. Werkowski pw@snoopy.mv.com * Douglas T. Crosher @@ -11,7 +11,7 @@ * */
- + #include "x86-validate.h" #define LANGUAGE_ASSEMBLY @@ -19,26 +19,43 @@ #include "lispregs.h"
/* Minimize conditionalization for different OS naming schemes */ -#ifndef DARWIN +#ifdef DARWIN +#define GNAME(var) _##var +#define FUNCDEF(x) \ + .text ; \ + .align 2,0x90 ; \ + .globl GNAME(x) ; \ +GNAME(x): ; +#define ENDFUNC(x) +#elif defined(SOLARIS) #define GNAME(var) var #define FUNCDEF(x) \ .text ; \ - .balign 4,0x90 ; \ + .align 16,0x90 ; \ .globl GNAME(x) ; \ .type x,@function ; \ GNAME(x): ; #define ENDFUNC(x) \ .size GNAME(x),.-GNAME(x) #else -#define GNAME(var) _##var +#define GNAME(var) var #define FUNCDEF(x) \ .text ; \ - .align 2,0x90 ; \ + .balign 4,0x90 ; \ .globl GNAME(x) ; \ + .type x,@function ; \ GNAME(x): ; -#define ENDFUNC(x) +#define ENDFUNC(x) \ + .size GNAME(x),.-GNAME(x) #endif
+#ifdef SOLARIS +#define INT3 int $3 + +#else +#define INT3 int3 +#endif + /* Get the right type of alignment. Linux wants alignment in bytes. */ #if defined (__linux__) || defined (__FreeBSD__) #define align_16byte 16 @@ -49,7 +66,7 @@ .text .globl GNAME(foreign_function_call_active) - + /* * The C function will preserve ebx, esi, edi, and ebp across its * function call - ebx is used to save the return lisp address. @@ -122,7 +139,7 @@ jmp *%ebx ENDFUNC(call_into_c)
- +
/* The C conventions require that ebx, esi, edi, and ebp be preserved across function calls. */ @@ -255,7 +272,7 @@ movl %edx,%eax # c-val ret ENDFUNC(call_into_lisp) - + /* Support for saving and restoring the NPX state from C. */ FUNCDEF(fpu_save) movl 4(%esp),%eax @@ -284,7 +301,7 @@ fxrstor (%eax) ret ENDFUNC(sse_restore) - +
#if 0 /* @@ -297,7 +314,7 @@ * The undefined-function trampoline. */ FUNCDEF(undefined_tramp) - int3 + INT3 .byte trap_Error /* Number of argument bytes */ .byte 2 @@ -339,23 +356,23 @@ .globl GNAME(function_end_breakpoint_trap) GNAME(function_end_breakpoint_trap): - int3 + INT3 .byte trap_FunctionEndBreakpoint hlt # Should never return here.
.globl GNAME(function_end_breakpoint_end) GNAME(function_end_breakpoint_end):
- + FUNCDEF(do_pending_interrupt) - int3 + INT3 .byte trap_PendingInterrupt ret ENDFUNC(do_pending_interrupt) #ifdef trap_DynamicSpaceOverflowError FUNCDEF(do_dynamic_space_overflow_error) - int3 + INT3 .byte trap_DynamicSpaceOverflowError ret ENDFUNC(do_dynamic_space_overflow_error) @@ -363,13 +380,13 @@ #ifdef trap_DynamicSpaceOverflowWarning FUNCDEF(do_dynamic_space_overflow_warning) - int3 + INT3 .byte trap_DynamicSpaceOverflowWarning ret ENDFUNC(do_dynamic_space_overflow_warning) #endif - + #ifdef WANT_CGC /* A copy function optimized for the Pentium and works ok on * 486 as well. This assumes (does not check) that the input @@ -423,7 +440,7 @@ ret ENDFUNC(fastcopy16) #endif - +
/* Allocate bytes and return the start of the allocated space @@ -666,7 +683,7 @@ ret ENDFUNC(alloc_16_to_edi)
- + #ifdef GENCGC
/* Called from lisp when an inline allocation overflows. @@ -832,7 +849,7 @@ movl 8(%ebp),%eax
/* Now trap to Lisp */ - int3 + INT3 .byte trap_Error /* Number of argument bytes */ .byte 2 Index: src/lisp/x86-validate.h diff -u src/lisp/x86-validate.h:1.31 src/lisp/x86-validate.h:1.31.8.1 --- src/lisp/x86-validate.h:1.31 Fri May 21 15:26:53 2010 +++ src/lisp/x86-validate.h Mon Dec 13 23:25:11 2010 @@ -3,7 +3,7 @@ * This code was written as part of the CMU Common Lisp project at * Carnegie Mellon University, and has been placed in the public domain. * - * $Header: /project/cmucl/cvsroot/src/lisp/x86-validate.h,v 1.31 2010-05-21 19:26:53 rtoy Rel $ + * $Header: /project/cmucl/cvsroot/src/lisp/x86-validate.h,v 1.31.8.1 2010-12-14 04:25:11 rtoy Exp $ * */
@@ -172,7 +172,7 @@ #define CONTROL_STACK_START 0x38000000 #define CONTROL_STACK_SIZE (0x07fff000 - 8192) #define SIGNAL_STACK_START CONTROL_STACK_END -#define SIGNAL_STACK_SIZE 8192 +#define SIGNAL_STACK_SIZE SIGSTKSZ
#define DYNAMIC_0_SPACE_START (SpaceStart_TargetDynamic)
@@ -188,6 +188,33 @@ #endif #endif
+#ifdef SOLARIS +#define READ_ONLY_SPACE_START (SpaceStart_TargetReadOnly) +#define READ_ONLY_SPACE_SIZE (0x0ffff000) /* 256MB - 1 page */ + +#define STATIC_SPACE_START (SpaceStart_TargetStatic) +#define STATIC_SPACE_SIZE (0x0ffff000) /* 256MB - 1 page */ + +#define BINDING_STACK_START (0x20000000) +#define BINDING_STACK_SIZE (0x07fff000) /* 128MB - 1 page */ + +#define CONTROL_STACK_START 0x38000000 +#define CONTROL_STACK_SIZE (0x07fff000 - 8192) +#define SIGNAL_STACK_SIZE SIGSTKSZ + +#define DYNAMIC_0_SPACE_START (SpaceStart_TargetDynamic) + +#ifdef GENCGC +#define DYNAMIC_SPACE_SIZE (0x66000000) /* 1.632GB */ +#else +#define DYNAMIC_SPACE_SIZE (0x04000000) /* 64MB */ +#endif +#define DEFAULT_DYNAMIC_SPACE_SIZE (0x20000000) /* 512MB */ +#ifdef LINKAGE_TABLE +#define FOREIGN_LINKAGE_SPACE_START (LinkageSpaceStart) +#define FOREIGN_LINKAGE_SPACE_SIZE (0x100000) /* 1MB */ +#endif +#endif
#define CONTROL_STACK_END (CONTROL_STACK_START + CONTROL_STACK_SIZE)
Index: src/tools/cross-scripts/cross-x86-osx-solaris.lisp diff -u /dev/null src/tools/cross-scripts/cross-x86-osx-solaris.lisp:1.1.2.1 --- /dev/null Mon Dec 13 23:25:11 2010 +++ src/tools/cross-scripts/cross-x86-osx-solaris.lisp Mon Dec 13 23:25:11 2010 @@ -0,0 +1,236 @@ +;; Basic cross-compile script for cross-compiling from x86 on darwin +;; (Mac OS X) to x86 on Solaris. This is a basic x86-to-x86 +;; cross-compile, except we tweek the features and misfeatures +;; for Solaris/x86. + +(in-package :cl-user) + +;;; Rename the X86 package and backend so that new-backend does the +;;; right thing. +(rename-package "X86" "OLD-X86" '("OLD-VM")) +(setf (c:backend-name c:*native-backend*) "OLD-X86") + +(c::new-backend "X86" + ;; Features to add here. These are just examples. You may not + ;; need to list anything here. We list them here anyway as a + ;; record of typical features for all x86 ports. + '(:x86 + :i486 + :pentium + :stack-checking ; Catches stack overflow + :heap-overflow-check ; Catches heap overflows + :relative-package-names ; relative package names + :mp ; multiprocessing + :gencgc ; Generational GC + :conservative-float-type + :complex-fp-vops + :hash-new + :random-mt19937 + :cmu :cmu20 :cmu20b ; Version features + :double-double ; double-double float support + :linkage-table + + :solaris :svr4 + ;; The :sse2 and :x87 features will get set by the compiling + ;; lisp, so don't set it here! + ) + ;; Features to remove from current *features* here. Normally don't + ;; need to list anything here unless you are trying to remove a + ;; feature. + '(:x86-bootstrap + ;; :alpha :osf1 :mips + :propagate-fun-type :propagate-float-type :constrain-float-type + ;; :openbsd :freebsd :glibc2 :linux + :mach-o :darwin + :long-float :new-random :small)) +;;; +(setf *features* (remove :bsd *features*)) +;; Set up the linkage space stuff appropriately for sparc. +(setf (c::backend-foreign-linkage-space-start c::*target-backend*) + #xC0000000 + (c::backend-foreign-linkage-entry-size c::*target-backend*) + 8) + +;;; +;;; Compile the new backend. +(pushnew :bootstrap *features*) +(pushnew :building-cross-compiler *features*) + +;; Make fixup-code-object and sanctify-for-execution in the VM package +;; be the same as the original. Needed to get rid of a compiler error +;; in generic/core.lisp. (This halts cross-compilations if the +;; compiling lisp uses the -batch flag. +(import 'old-vm::fixup-code-object "VM") +(import 'old-vm::sanctify-for-execution "VM") +(export 'vm::fixup-code-object "VM") +(export 'vm::sanctify-for-execution "VM") + +(load "target:tools/comcom") + +;;; Load the new backend. +(setf (search-list "c:") + '("target:compiler/")) +(setf (search-list "vm:") + '("c:x86/" "c:generic/")) +(setf (search-list "assem:") + '("target:assembly/" "target:assembly/x86/")) + +;; Load the backend of the compiler. + +(in-package "C") + +(load "vm:vm-macs") +(load "vm:parms") +(load "vm:objdef") +(load "vm:interr") +(load "assem:support") + +(load "target:compiler/srctran") +(load "vm:vm-typetran") +(load "target:compiler/float-tran") +(load "target:compiler/saptran") + +(load "vm:macros") +(load "vm:utils") + +(load "vm:vm") +(load "vm:insts") +(load "vm:primtype") +(load "vm:move") +(load "vm:sap") +(when (target-featurep :sse2) + (load "vm:sse2-sap")) +(load "vm:system") +(load "vm:char") +(if (target-featurep :sse2) + (load "vm:float-sse2") + (load "vm:float")) + +(load "vm:memory") +(load "vm:static-fn") +(load "vm:arith") +(load "vm:cell") +(load "vm:subprim") +(load "vm:debug") +(load "vm:c-call") +(if (target-featurep :sse2) + (load "vm:sse2-c-call") + (load "vm:x87-c-call")) + +(load "vm:print") +(load "vm:alloc") +(load "vm:call") +(load "vm:nlx") +(load "vm:values") +;; These need to be loaded before array because array wants to use +;; some vops as templates. +(load (if (target-featurep :sse2) + "vm:sse2-array" + "vm:x87-array")) +(load "vm:array") +(load "vm:pred") +(load "vm:type-vops") + +(load "assem:assem-rtns") + +(load "assem:array") +(load "assem:arith") +(load "assem:alloc") + +(load "c:pseudo-vops") + +(check-move-function-consistency) + +(load "vm:new-genesis") + +;;; OK, the cross compiler backend is loaded. + +(setf *features* (remove :building-cross-compiler *features*)) + +;;; Info environment hacks. +(macrolet ((frob (&rest syms) + `(progn ,@(mapcar #'(lambda (sym) + `(defconstant ,sym + (symbol-value + (find-symbol ,(symbol-name sym) + :vm)))) + syms)))) + (frob OLD-VM:BYTE-BITS OLD-VM:WORD-BITS + OLD-VM:CHAR-BITS + #+long-float OLD-VM:SIMPLE-ARRAY-LONG-FLOAT-TYPE + OLD-VM:SIMPLE-ARRAY-DOUBLE-FLOAT-TYPE + OLD-VM:SIMPLE-ARRAY-SINGLE-FLOAT-TYPE + #+long-float OLD-VM:SIMPLE-ARRAY-COMPLEX-LONG-FLOAT-TYPE + OLD-VM:SIMPLE-ARRAY-COMPLEX-DOUBLE-FLOAT-TYPE + OLD-VM:SIMPLE-ARRAY-COMPLEX-SINGLE-FLOAT-TYPE + OLD-VM:SIMPLE-ARRAY-UNSIGNED-BYTE-2-TYPE + OLD-VM:SIMPLE-ARRAY-UNSIGNED-BYTE-4-TYPE + OLD-VM:SIMPLE-ARRAY-UNSIGNED-BYTE-8-TYPE + OLD-VM:SIMPLE-ARRAY-UNSIGNED-BYTE-16-TYPE + OLD-VM:SIMPLE-ARRAY-UNSIGNED-BYTE-32-TYPE + OLD-VM:SIMPLE-ARRAY-SIGNED-BYTE-8-TYPE + OLD-VM:SIMPLE-ARRAY-SIGNED-BYTE-16-TYPE + OLD-VM:SIMPLE-ARRAY-SIGNED-BYTE-30-TYPE + OLD-VM:SIMPLE-ARRAY-SIGNED-BYTE-32-TYPE + OLD-VM:SIMPLE-BIT-VECTOR-TYPE + OLD-VM:SIMPLE-STRING-TYPE OLD-VM:SIMPLE-VECTOR-TYPE + OLD-VM:SIMPLE-ARRAY-TYPE OLD-VM:VECTOR-DATA-OFFSET + OLD-VM:DOUBLE-FLOAT-EXPONENT-BYTE + OLD-VM:DOUBLE-FLOAT-NORMAL-EXPONENT-MAX + OLD-VM:DOUBLE-FLOAT-SIGNIFICAND-BYTE + OLD-VM:SINGLE-FLOAT-EXPONENT-BYTE + OLD-VM:SINGLE-FLOAT-NORMAL-EXPONENT-MAX + OLD-VM:SINGLE-FLOAT-SIGNIFICAND-BYTE + ) + #+double-double + (frob OLD-VM:SIMPLE-ARRAY-COMPLEX-DOUBLE-DOUBLE-FLOAT-TYPE + OLD-VM:SIMPLE-ARRAY-DOUBLE-DOUBLE-FLOAT-TYPE)) + +;; Modular arith hacks +(setf (fdefinition 'vm::ash-left-mod32) #'old-vm::ash-left-mod32) +(setf (fdefinition 'vm::lognot-mod32) #'old-vm::lognot-mod32) +;; End arith hacks + +(let ((function (symbol-function 'kernel:error-number-or-lose))) + (let ((*info-environment* (c:backend-info-environment c:*target-backend*))) + (setf (symbol-function 'kernel:error-number-or-lose) function) + (setf (info function kind 'kernel:error-number-or-lose) :function) + (setf (info function where-from 'kernel:error-number-or-lose) :defined))) + +(defun fix-class (name) + (let* ((new-value (find-class name)) + (new-layout (kernel::%class-layout new-value)) + (new-cell (kernel::find-class-cell name)) + (*info-environment* (c:backend-info-environment c:*target-backend*))) + (remhash name kernel::*forward-referenced-layouts*) + (kernel::%note-type-defined name) + (setf (info type kind name) :instance) + (setf (info type class name) new-cell) + (setf (info type compiler-layout name) new-layout) + new-value)) +(fix-class 'c::vop-parse) +(fix-class 'c::operand-parse) + +#+random-mt19937 +(declaim (notinline kernel:random-chunk)) + +(setf c:*backend* c:*target-backend*) + +;;; Extern-alien-name for the new backend. +(in-package :vm) +(defun extern-alien-name (name) + (declare (type simple-string name)) + name) +(export 'extern-alien-name) +(in-package :cl-user) + +;;; Don't load compiler parts from the target compilation + +(defparameter *load-stuff* nil) + +;; hack, hack, hack: Make old-vm::any-reg the same as +;; x86::any-reg as an SC. Do this by adding old-vm::any-reg +;; to the hash table with the same value as x86::any-reg. +(let ((ht (c::backend-sc-names c::*target-backend*))) + (setf (gethash 'old-vm::any-reg ht) + (gethash 'vm::any-reg ht)))