X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fruntime.c;h=23c323f5702784fb6ed48b7d11068f906fc4d6c3;hb=d1873cc3f7a09f9891bb9c05f206af1774876c0c;hp=3491f03d555258b30dbec20af609ccd16f244a53;hpb=dc5d8cef786c974258601109f79ab18f874b1270;p=sbcl.git diff --git a/src/runtime/runtime.c b/src/runtime/runtime.c index 3491f03..23c323f 100644 --- a/src/runtime/runtime.c +++ b/src/runtime/runtime.c @@ -70,6 +70,12 @@ #define SBCL_HOME "/usr/local/lib/sbcl/" #endif +#ifdef LISP_FEATURE_HPUX +extern void *return_from_lisp_stub; +#include "genesis/closure.h" +#include "genesis/simple-fun.h" +#endif + /* SIGINT handler that invokes the monitor (for when Lisp isn't up to it) */ static void @@ -121,19 +127,6 @@ copied_existing_filename_or_null(char *filename) return copied_string(filename); } } - -/* Convert a null-terminated array of null-terminated strings (e.g. - * argv or envp) into a Lisp list of Lisp base-strings. */ -static lispobj -alloc_base_string_list(char *array_ptr[]) -{ - if (*array_ptr) { - return alloc_cons(alloc_base_string(*array_ptr), - alloc_base_string_list(1 + array_ptr)); - } else { - return NIL; - } -} /* miscellaneous chattiness */ @@ -215,6 +208,8 @@ search_for_core () char **posix_argv; char *core_string; +struct runtime_options *runtime_options; + int main(int argc, char *argv[], char *envp[]) @@ -229,10 +224,12 @@ main(int argc, char *argv[], char *envp[]) char *core = 0; char **sbcl_argv = 0; os_vm_offset_t embedded_core_offset = 0; + char *runtime_path = 0; /* other command line options */ boolean noinform = 0; boolean end_runtime_options = 0; + boolean disable_lossage_handler_p = 0; lispobj initial_function; const char *sbcl_home = getenv("SBCL_HOME"); @@ -242,13 +239,47 @@ main(int argc, char *argv[], char *envp[]) setlocale(LC_ALL, ""); + runtime_options = NULL; + + /* Check early to see if this executable has an embedded core, + * which also populates runtime_options if the core has runtime + * options */ + runtime_path = os_get_runtime_executable_path(); + if (runtime_path) { + os_vm_offset_t offset = search_for_embedded_core(runtime_path); + if (offset != -1) { + embedded_core_offset = offset; + core = runtime_path; + } else { + free(runtime_path); + } + } + + /* Parse our part of the command line (aka "runtime options"), * stripping out those options that we handle. */ - { + if (runtime_options != NULL) { + dynamic_space_size = runtime_options->dynamic_space_size; + thread_control_stack_size = runtime_options->thread_control_stack_size; + sbcl_argv = argv; + } else { int argi = 1; + + runtime_options = successful_malloc(sizeof(struct runtime_options)); + while (argi < argc) { char *arg = argv[argi]; - if (0 == strcmp(arg, "--noinform")) { + if (0 == strcmp(arg, "--script")) { + /* This is both a runtime and a toplevel option. As a + * runtime option, it is equivalent to --noinform. + * This exits, and does not increment argi, so that + * TOPLEVEL-INIT sees the option. */ + noinform = 1; + end_runtime_options = 1; + disable_lossage_handler_p = 1; + lose_on_corruption_p = 1; + break; + } else if (0 == strcmp(arg, "--noinform")) { noinform = 1; ++argi; } else if (0 == strcmp(arg, "--core")) { @@ -280,6 +311,13 @@ main(int argc, char *argv[], char *envp[]) dynamic_space_size = strtol(argv[argi++], 0, 0) << 20; if (errno) lose("argument to --dynamic-space-size is not a number"); +# ifdef MAX_DYNAMIC_SPACE_END + if (!((DYNAMIC_SPACE_START < + DYNAMIC_SPACE_START+dynamic_space_size) && + (DYNAMIC_SPACE_START+dynamic_space_size <= + MAX_DYNAMIC_SPACE_END))) + lose("specified --dynamic-space-size too large"); +# endif } else if (0 == strcmp(arg, "--control-stack-size")) { ++argi; if (argi >= argc) @@ -287,7 +325,7 @@ main(int argc, char *argv[], char *envp[]) errno = 0; thread_control_stack_size = strtol(argv[argi++], 0, 0) << 20; if (errno) - lose("argument to --dynamic-space-size is not a number"); + lose("argument to --control-stack-size is not a number"); } else if (0 == strcmp(arg, "--debug-environment")) { int n = 0; printf("; Commandline arguments:\n"); @@ -302,6 +340,12 @@ main(int argc, char *argv[], char *envp[]) ++n; } ++argi; + } else if (0 == strcmp(arg, "--disable-ldb")) { + disable_lossage_handler_p = 1; + ++argi; + } else if (0 == strcmp(arg, "--lose-on-corruption")) { + lose_on_corruption_p = 1; + ++argi; } else if (0 == strcmp(arg, "--end-runtime-options")) { end_runtime_options = 1; ++argi; @@ -346,6 +390,10 @@ main(int argc, char *argv[], char *envp[]) dynamic_space_size &= ~(PAGE_BYTES-1); thread_control_stack_size &= ~(CONTROL_STACK_ALIGNMENT_BYTES-1); + /* Preserve the runtime options for possible future core saving */ + runtime_options->dynamic_space_size = dynamic_space_size; + runtime_options->thread_control_stack_size = thread_control_stack_size; + /* KLUDGE: os_vm_page_size is set by os_init(), and on some * systems (e.g. Alpha) arch_init() needs need os_vm_page_size, so * it must follow os_init(). -- WHN 2000-01-26 */ @@ -356,21 +404,7 @@ main(int argc, char *argv[], char *envp[]) /* If no core file was specified, look for one. */ if (!core) { - char *runtime_path = os_get_runtime_executable_path(); - - if (runtime_path) { - os_vm_offset_t offset = search_for_embedded_core(runtime_path); - - if (offset != -1) { - embedded_core_offset = offset; - core = runtime_path; - } else { - free(runtime_path); - core = search_for_core(); - } - } else { - core = search_for_core(); - } + core = search_for_core(); } /* Make sure that SBCL_HOME is set and not the empty string, @@ -401,7 +435,8 @@ main(int argc, char *argv[], char *envp[]) define_var("nil", NIL, 1); define_var("t", T, 1); - enable_lossage_handler(); + if (!disable_lossage_handler_p) + enable_lossage_handler(); globals_init(); @@ -409,6 +444,12 @@ main(int argc, char *argv[], char *envp[]) if (initial_function == NIL) { lose("couldn't find initial function\n"); } +#ifdef LISP_FEATURE_HPUX + /* -1 = CLOSURE_FUN_OFFSET, 23 = SIMPLE_FUN_CODE_OFFSET, we are + * not in LANGUAGE_ASSEMBLY so we cant reach them. */ + return_from_lisp_stub = (void *) ((char *)*((unsigned long *) + ((char *)initial_function + -1)) + 23); +#endif gc_initialize_pointers();