From 5f4fe75b7ee2b33e263097415240d198b6275de3 Mon Sep 17 00:00:00 2001 From: Nikodemus Siivola Date: Wed, 4 Apr 2007 13:11:15 +0000 Subject: [PATCH] 1.0.4.21: merge redundant funcallN definitions in the runtime * We need only two implementations, not one per arch: put them into a new file "funcall.c". --- src/runtime/GNUmakefile | 4 +- src/runtime/alpha-arch.c | 43 ----------------- src/runtime/funcall.c | 114 +++++++++++++++++++++++++++++++++++++++++++++ src/runtime/hppa-arch.c | 41 ---------------- src/runtime/mips-arch.c | 46 ------------------ src/runtime/ppc-arch.c | 43 ----------------- src/runtime/sparc-arch.c | 42 ----------------- src/runtime/x86-64-arch.c | 47 ------------------- src/runtime/x86-arch.c | 46 ------------------ version.lisp-expr | 2 +- 10 files changed, 117 insertions(+), 311 deletions(-) create mode 100644 src/runtime/funcall.c diff --git a/src/runtime/GNUmakefile b/src/runtime/GNUmakefile index af75160..afa6026 100644 --- a/src/runtime/GNUmakefile +++ b/src/runtime/GNUmakefile @@ -39,8 +39,8 @@ include genesis/Makefile.features include Config COMMON_SRC = alloc.c backtrace.c breakpoint.c coreparse.c \ - dynbind.c gc-common.c globals.c interr.c interrupt.c largefile.c \ - monitor.c os-common.c parse.c print.c purify.c \ + dynbind.c funcall.c gc-common.c globals.c interr.c interrupt.c \ + largefile.c monitor.c os-common.c parse.c print.c purify.c \ pthread-futex.c pthread-lutex.c \ regnames.c run-program.c runtime.c save.c search.c \ thread.c time.c util.c validate.c vars.c wrap.c diff --git a/src/runtime/alpha-arch.c b/src/runtime/alpha-arch.c index 26fa572..5c71fa7 100644 --- a/src/runtime/alpha-arch.c +++ b/src/runtime/alpha-arch.c @@ -348,46 +348,3 @@ void arch_install_interrupt_handlers() { undoably_install_low_level_interrupt_handler(SIGTRAP, sigtrap_handler); } - -extern lispobj call_into_lisp(lispobj fun, lispobj *args, int nargs); - -lispobj funcall0(lispobj function) -{ - lispobj *args = current_control_stack_pointer; - - return call_into_lisp(function, args, 0); -} - -lispobj funcall1(lispobj function, lispobj arg0) -{ - lispobj *args = current_control_stack_pointer; - - current_control_stack_pointer += 1; - args[0] = arg0; - - return call_into_lisp(function, args, 1); -} - -lispobj funcall2(lispobj function, lispobj arg0, lispobj arg1) -{ - lispobj *args = current_control_stack_pointer; - - current_control_stack_pointer += 2; - args[0] = arg0; - args[1] = arg1; - - return call_into_lisp(function, args, 2); -} - -lispobj funcall3(lispobj function, lispobj arg0, lispobj arg1, lispobj arg2) -{ - lispobj *args = current_control_stack_pointer; - - current_control_stack_pointer += 3; - args[0] = arg0; - args[1] = arg1; - args[2] = arg2; - - return call_into_lisp(function, args, 3); -} - diff --git a/src/runtime/funcall.c b/src/runtime/funcall.c new file mode 100644 index 0000000..815268a --- /dev/null +++ b/src/runtime/funcall.c @@ -0,0 +1,114 @@ +/* funcall0 -- funcall3: we can get by with just two sets of these: + * for platforms where the control stack is the C-stack, and all others. + */ + +/* + * This software is part of the SBCL system. See the README file for + * more information. + * + * This software is derived from the CMU CL system, which was + * written at Carnegie Mellon University and released into the + * public domain. The software is in the public domain and is + * provided with absolutely no warranty. See the COPYING and CREDITS + * files for more information. + */ + +#include + +#include "sbcl.h" +#include "runtime.h" + +/* This is implemented in assembly language and called from C: */ +extern lispobj call_into_lisp(lispobj fun, lispobj *args, int nargs); + +#ifdef LISP_FEATURE_C_STACK_IS_CONTROL_STACK +/* These functions are an interface to the Lisp call-in facility. + * Since this is C we can know nothing about the calling environment. + * The control stack might be the C stack if called from the monitor + * or the Lisp stack if called as a result of an interrupt or maybe + * even a separate stack. The args are most likely on that stack but + * could be in registers depending on what the compiler likes. So we + * copy the args into a portable vector and let the assembly language + * call-in function figure it out. */ + +lispobj +funcall0(lispobj function) +{ + lispobj *args = NULL; + + FSHOW((stderr, "/entering funcall0(0x%lx)\n", (long)function)); + return call_into_lisp(function, args, 0); +} +lispobj +funcall1(lispobj function, lispobj arg0) +{ + lispobj args[1]; + args[0] = arg0; + return call_into_lisp(function, args, 1); +} + +lispobj +funcall2(lispobj function, lispobj arg0, lispobj arg1) +{ + lispobj args[2]; + args[0] = arg0; + args[1] = arg1; + return call_into_lisp(function, args, 2); +} + +lispobj +funcall3(lispobj function, lispobj arg0, lispobj arg1, lispobj arg2) +{ + lispobj args[3]; + args[0] = arg0; + args[1] = arg1; + args[2] = arg2; + return call_into_lisp(function, args, 3); +} + +#else + +lispobj +funcall0(lispobj function) +{ + lispobj *args = current_control_stack_pointer; + + return call_into_lisp(function, args, 0); +} + +lispobj +funcall1(lispobj function, lispobj arg0) +{ + lispobj *args = current_control_stack_pointer; + + current_control_stack_pointer += 1; + args[0] = arg0; + + return call_into_lisp(function, args, 1); +} + +lispobj +funcall2(lispobj function, lispobj arg0, lispobj arg1) +{ + lispobj *args = current_control_stack_pointer; + + current_control_stack_pointer += 2; + args[0] = arg0; + args[1] = arg1; + + return call_into_lisp(function, args, 2); +} + +lispobj +funcall3(lispobj function, lispobj arg0, lispobj arg1, lispobj arg2) +{ + lispobj *args = current_control_stack_pointer; + + current_control_stack_pointer += 3; + args[0] = arg0; + args[1] = arg1; + args[2] = arg2; + + return call_into_lisp(function, args, 3); +} +#endif diff --git a/src/runtime/hppa-arch.c b/src/runtime/hppa-arch.c index a2a758b..46fdb34 100644 --- a/src/runtime/hppa-arch.c +++ b/src/runtime/hppa-arch.c @@ -396,44 +396,3 @@ void arch_install_interrupt_handlers(void) /* FIXME: beyond 2.4.19-pa4 this shouldn't be necessary. */ undoably_install_low_level_interrupt_handler(SIGBUS,sigbus_handler); } - - -lispobj funcall0(lispobj function) -{ - lispobj *args = current_control_stack_pointer; - - return call_into_lisp(function, args, 0); -} - -lispobj funcall1(lispobj function, lispobj arg0) -{ - lispobj *args = current_control_stack_pointer; - - current_control_stack_pointer += 1; - args[0] = arg0; - - return call_into_lisp(function, args, 1); -} - -lispobj funcall2(lispobj function, lispobj arg0, lispobj arg1) -{ - lispobj *args = current_control_stack_pointer; - - current_control_stack_pointer += 2; - args[0] = arg0; - args[1] = arg1; - - return call_into_lisp(function, args, 2); -} - -lispobj funcall3(lispobj function, lispobj arg0, lispobj arg1, lispobj arg2) -{ - lispobj *args = current_control_stack_pointer; - - current_control_stack_pointer += 3; - args[0] = arg0; - args[1] = arg1; - args[2] = arg2; - - return call_into_lisp(function, args, 3); -} diff --git a/src/runtime/mips-arch.c b/src/runtime/mips-arch.c index 590f9b1..1d6b127 100644 --- a/src/runtime/mips-arch.c +++ b/src/runtime/mips-arch.c @@ -469,52 +469,6 @@ arch_install_interrupt_handlers(void) undoably_install_low_level_interrupt_handler(SIGFPE,sigfpe_handler); } -extern lispobj call_into_lisp(lispobj fun, lispobj *args, int nargs); - -lispobj -funcall0(lispobj function) -{ - lispobj *args = current_control_stack_pointer; - - return call_into_lisp(function, args, 0); -} - -lispobj -funcall1(lispobj function, lispobj arg0) -{ - lispobj *args = current_control_stack_pointer; - - current_control_stack_pointer += 1; - args[0] = arg0; - - return call_into_lisp(function, args, 1); -} - -lispobj -funcall2(lispobj function, lispobj arg0, lispobj arg1) -{ - lispobj *args = current_control_stack_pointer; - - current_control_stack_pointer += 2; - args[0] = arg0; - args[1] = arg1; - - return call_into_lisp(function, args, 2); -} - -lispobj -funcall3(lispobj function, lispobj arg0, lispobj arg1, lispobj arg2) -{ - lispobj *args = current_control_stack_pointer; - - current_control_stack_pointer += 3; - args[0] = arg0; - args[1] = arg1; - args[2] = arg2; - - return call_into_lisp(function, args, 3); -} - #ifdef LISP_FEATURE_LINKAGE_TABLE /* Linkage tables for MIPS diff --git a/src/runtime/ppc-arch.c b/src/runtime/ppc-arch.c index ad4450a..dca032e 100644 --- a/src/runtime/ppc-arch.c +++ b/src/runtime/ppc-arch.c @@ -472,49 +472,6 @@ void arch_install_interrupt_handlers() undoably_install_low_level_interrupt_handler(SIGTRAP,sigtrap_handler); } - -extern lispobj call_into_lisp(lispobj fun, lispobj *args, int nargs); - -lispobj funcall0(lispobj function) -{ - lispobj *args = current_control_stack_pointer; - - return call_into_lisp(function, args, 0); -} - -lispobj funcall1(lispobj function, lispobj arg0) -{ - lispobj *args = current_control_stack_pointer; - - current_control_stack_pointer += 1; - args[0] = arg0; - - return call_into_lisp(function, args, 1); -} - -lispobj funcall2(lispobj function, lispobj arg0, lispobj arg1) -{ - lispobj *args = current_control_stack_pointer; - - current_control_stack_pointer += 2; - args[0] = arg0; - args[1] = arg1; - - return call_into_lisp(function, args, 2); -} - -lispobj funcall3(lispobj function, lispobj arg0, lispobj arg1, lispobj arg2) -{ - lispobj *args = current_control_stack_pointer; - - current_control_stack_pointer += 3; - args[0] = arg0; - args[1] = arg1; - args[2] = arg2; - - return call_into_lisp(function, args, 3); -} - void ppc_flush_icache(os_vm_address_t address, os_vm_size_t length) { diff --git a/src/runtime/sparc-arch.c b/src/runtime/sparc-arch.c index c2f7d2d..6f0d90a 100644 --- a/src/runtime/sparc-arch.c +++ b/src/runtime/sparc-arch.c @@ -367,48 +367,6 @@ void arch_install_interrupt_handlers() } -extern lispobj call_into_lisp(lispobj fun, lispobj *args, int nargs); - -lispobj funcall0(lispobj function) -{ - lispobj *args = current_control_stack_pointer; - - return call_into_lisp(function, args, 0); -} - -lispobj funcall1(lispobj function, lispobj arg0) -{ - lispobj *args = current_control_stack_pointer; - - current_control_stack_pointer += 1; - args[0] = arg0; - - return call_into_lisp(function, args, 1); -} - -lispobj funcall2(lispobj function, lispobj arg0, lispobj arg1) -{ - lispobj *args = current_control_stack_pointer; - - current_control_stack_pointer += 2; - args[0] = arg0; - args[1] = arg1; - - return call_into_lisp(function, args, 2); -} - -lispobj funcall3(lispobj function, lispobj arg0, lispobj arg1, lispobj arg2) -{ - lispobj *args = current_control_stack_pointer; - - current_control_stack_pointer += 3; - args[0] = arg0; - args[1] = arg1; - args[2] = arg2; - - return call_into_lisp(function, args, 3); -} - #ifdef LISP_FEATURE_LINKAGE_TABLE /* This a naive port from CMUCL/sparc, which was mostly stolen from the diff --git a/src/runtime/x86-64-arch.c b/src/runtime/x86-64-arch.c index 0a4769a..84082a0 100644 --- a/src/runtime/x86-64-arch.c +++ b/src/runtime/x86-64-arch.c @@ -377,53 +377,6 @@ arch_install_interrupt_handlers() SHOW("returning from arch_install_interrupt_handlers()"); } -/* This is implemented in assembly language and called from C: */ -extern lispobj -call_into_lisp(lispobj fun, lispobj *args, int nargs); - -/* These functions are an interface to the Lisp call-in facility. - * Since this is C we can know nothing about the calling environment. - * The control stack might be the C stack if called from the monitor - * or the Lisp stack if called as a result of an interrupt or maybe - * even a separate stack. The args are most likely on that stack but - * could be in registers depending on what the compiler likes. So we - * copy the args into a portable vector and let the assembly language - * call-in function figure it out. */ - -lispobj -funcall0(lispobj function) -{ - lispobj *args = NULL; - - FSHOW((stderr, "/entering funcall0(0x%lx)\n", (long)function)); - return call_into_lisp(function, args, 0); -} -lispobj -funcall1(lispobj function, lispobj arg0) -{ - lispobj args[1]; - args[0] = arg0; - return call_into_lisp(function, args, 1); -} -lispobj -funcall2(lispobj function, lispobj arg0, lispobj arg1) -{ - lispobj args[2]; - args[0] = arg0; - args[1] = arg1; - return call_into_lisp(function, args, 2); -} -lispobj -funcall3(lispobj function, lispobj arg0, lispobj arg1, lispobj arg2) -{ - lispobj args[3]; - args[0] = arg0; - args[1] = arg1; - args[2] = arg2; - return call_into_lisp(function, args, 3); -} - - #ifdef LISP_FEATURE_LINKAGE_TABLE /* FIXME: It might be cleaner to generate these from the lisp side of * things. diff --git a/src/runtime/x86-arch.c b/src/runtime/x86-arch.c index 0a8bdd5..b417bd7 100644 --- a/src/runtime/x86-arch.c +++ b/src/runtime/x86-arch.c @@ -342,52 +342,6 @@ arch_install_interrupt_handlers() SHOW("returning from arch_install_interrupt_handlers()"); } -/* This is implemented in assembly language and called from C: */ -extern lispobj -call_into_lisp(lispobj fun, lispobj *args, int nargs); - -/* These functions are an interface to the Lisp call-in facility. - * Since this is C we can know nothing about the calling environment. - * The control stack might be the C stack if called from the monitor - * or the Lisp stack if called as a result of an interrupt or maybe - * even a separate stack. The args are most likely on that stack but - * could be in registers depending on what the compiler likes. So we - * copy the args into a portable vector and let the assembly language - * call-in function figure it out. */ - -lispobj -funcall0(lispobj function) -{ - lispobj *args = NULL; - - FSHOW((stderr, "/entering funcall0(0x%lx)\n", (long)function)); - return call_into_lisp(function, args, 0); -} -lispobj -funcall1(lispobj function, lispobj arg0) -{ - lispobj args[1]; - args[0] = arg0; - return call_into_lisp(function, args, 1); -} -lispobj -funcall2(lispobj function, lispobj arg0, lispobj arg1) -{ - lispobj args[2]; - args[0] = arg0; - args[1] = arg1; - return call_into_lisp(function, args, 2); -} -lispobj -funcall3(lispobj function, lispobj arg0, lispobj arg1, lispobj arg2) -{ - lispobj args[3]; - args[0] = arg0; - args[1] = arg1; - args[2] = arg2; - return call_into_lisp(function, args, 3); -} - #ifdef LISP_FEATURE_LINKAGE_TABLE /* FIXME: It might be cleaner to generate these from the lisp side of * things. diff --git a/version.lisp-expr b/version.lisp-expr index b7bbeae..d758386 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".) -"1.0.4.20" +"1.0.4.21" -- 1.7.10.4