void jl_gc_init(void) { int szc[N_POOLS] = { 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 64, 72, 80, 88, 96, //#=18 112, 128, 144, 160, 176, 192, 208, 224, 240, 256, 288, 320, 352, 384, 416, 448, 480, 512, 640, 768, 896, 1024, 1536, 2048 }; int i; for(i=0; i < N_POOLS; i++) { norm_pools[i].osize = szc[i]; norm_pools[i].pages = NULL; norm_pools[i].freelist = NULL; ephe_pools[i].osize = szc[i]; ephe_pools[i].pages = NULL; ephe_pools[i].freelist = NULL; } htable_new(&finalizer_table, 0); arraylist_new(&to_finalize, 0); arraylist_new(&preserved_values, 0); arraylist_new(&weak_refs, 0); #ifdef OBJPROFILE htable_new(&obj_counts, 0); #endif #ifdef GC_FINAL_STATS process_t0 = clock_now(); #endif #ifdef _P64 // on a big memory machine, set max_collect_interval to totalmem/ncores/2 size_t maxmem = (uv_get_total_memory()/jl_cpu_cores())/2; if (maxmem > max_collect_interval) max_collect_interval = maxmem; #endif }
void julia_init(char *imageFile) { jl_page_size = jl_getpagesize(); jl_find_stack_bottom(); jl_dl_handle = jl_load_dynamic_library(NULL, JL_RTLD_DEFAULT); #ifdef __WIN32__ uv_dlopen("ntdll.dll",jl_ntdll_handle); //bypass julia's pathchecking for system dlls uv_dlopen("Kernel32.dll",jl_kernel32_handle); uv_dlopen("msvcrt.dll",jl_crtdll_handle); uv_dlopen("Ws2_32.dll",jl_winsock_handle); _jl_exe_handle.handle = GetModuleHandleA(NULL); #endif jl_io_loop = uv_default_loop(); //this loop will internal events (spawining process etc.) init_stdio(); #if defined(__linux__) int ncores = jl_cpu_cores(); if (ncores > 1) { cpu_set_t cpumask; CPU_ZERO(&cpumask); for(int i=0; i < ncores; i++) { CPU_SET(i, &cpumask); } sched_setaffinity(0, sizeof(cpu_set_t), &cpumask); } #endif #ifdef JL_GC_MARKSWEEP jl_gc_init(); jl_gc_disable(); #endif jl_init_frontend(); jl_init_types(); jl_init_tasks(jl_stack_lo, jl_stack_hi-jl_stack_lo); jl_init_codegen(); jl_an_empty_cell = (jl_value_t*)jl_alloc_cell_1d(0); jl_init_serializer(); if (!imageFile) { jl_main_module = jl_new_module(jl_symbol("Main")); jl_main_module->parent = jl_main_module; jl_core_module = jl_new_module(jl_symbol("Core")); jl_core_module->parent = jl_main_module; jl_set_const(jl_main_module, jl_symbol("Core"), (jl_value_t*)jl_core_module); jl_module_using(jl_main_module, jl_core_module); jl_current_module = jl_core_module; jl_init_intrinsic_functions(); jl_init_primitives(); jl_load("boot.jl"); jl_get_builtin_hooks(); jl_boot_file_loaded = 1; jl_init_box_caches(); } if (imageFile) { JL_TRY { jl_restore_system_image(imageFile); } JL_CATCH { JL_PRINTF(JL_STDERR, "error during init:\n"); jl_show(jl_stderr_obj(), jl_exception_in_transit); JL_PRINTF(JL_STDOUT, "\n"); jl_exit(1); } } // set module field of primitive types int i; void **table = jl_core_module->bindings.table; for(i=1; i < jl_core_module->bindings.size; i+=2) { if (table[i] != HT_NOTFOUND) { jl_binding_t *b = (jl_binding_t*)table[i]; if (b->value && jl_is_datatype(b->value)) { jl_datatype_t *tt = (jl_datatype_t*)b->value; tt->name->module = jl_core_module; } } } // the Main module is the one which is always open, and set as the // current module for bare (non-module-wrapped) toplevel expressions. // it does "using Base" if Base is available. if (jl_base_module != NULL) { jl_add_standard_imports(jl_main_module); } // eval() uses Main by default, so Main.eval === Core.eval jl_module_import(jl_main_module, jl_core_module, jl_symbol("eval")); jl_current_module = jl_main_module; #ifndef __WIN32__ struct sigaction actf; memset(&actf, 0, sizeof(struct sigaction)); sigemptyset(&actf.sa_mask); actf.sa_handler = fpe_handler; actf.sa_flags = 0; if (sigaction(SIGFPE, &actf, NULL) < 0) { JL_PRINTF(JL_STDERR, "sigaction: %s\n", strerror(errno)); jl_exit(1); } stack_t ss; ss.ss_flags = 0; ss.ss_size = SIGSTKSZ; ss.ss_sp = malloc(ss.ss_size); if (sigaltstack(&ss, NULL) < 0) { JL_PRINTF(JL_STDERR, "sigaltstack: %s\n", strerror(errno)); jl_exit(1); } struct sigaction act; memset(&act, 0, sizeof(struct sigaction)); sigemptyset(&act.sa_mask); act.sa_sigaction = segv_handler; act.sa_flags = SA_ONSTACK | SA_SIGINFO; if (sigaction(SIGSEGV, &act, NULL) < 0) { JL_PRINTF(JL_STDERR, "sigaction: %s\n", strerror(errno)); jl_exit(1); } #else if (signal(SIGFPE, (void (__cdecl *)(int))fpe_handler) == SIG_ERR) { JL_PRINTF(JL_STDERR, "Couldn't set SIGFPE\n"); jl_exit(1); } #endif #ifdef JL_GC_MARKSWEEP jl_gc_enable(); #endif }
void parse_opts(int *argcp, char ***argvp) { enum { opt_machinefile = 300, opt_color, opt_history_file, opt_no_history_file, opt_startup_file, opt_compile, opt_code_coverage, opt_track_allocation, opt_check_bounds, opt_output_bc, opt_depwarn, opt_inline, opt_math_mode, opt_worker, opt_bind_to, opt_handle_signals, opt_output_o, opt_output_ji, opt_use_precompiled, opt_use_compilecache, opt_incremental }; static char* shortopts = "+vhqFfH:e:E:P:L:J:C:ip:O:"; static struct option longopts[] = { // exposed command line options // NOTE: This set of required arguments need to be kept in sync // with the required arguments defined in base/client.jl `process_options()` { "version", no_argument, 0, 'v' }, { "help", no_argument, 0, 'h' }, { "quiet", no_argument, 0, 'q' }, { "home", required_argument, 0, 'H' }, { "eval", required_argument, 0, 'e' }, { "print", required_argument, 0, 'E' }, { "post-boot", required_argument, 0, 'P' }, { "load", required_argument, 0, 'L' }, { "sysimage", required_argument, 0, 'J' }, { "precompiled", required_argument, 0, opt_use_precompiled }, { "compilecache", required_argument, 0, opt_use_compilecache }, { "cpu-target", required_argument, 0, 'C' }, { "procs", required_argument, 0, 'p' }, { "machinefile", required_argument, 0, opt_machinefile }, { "color", required_argument, 0, opt_color }, { "history-file", required_argument, 0, opt_history_file }, { "no-history-file", no_argument, 0, opt_no_history_file }, // deprecated { "startup-file", required_argument, 0, opt_startup_file }, { "no-startup", no_argument, 0, 'f' }, // deprecated { "compile", required_argument, 0, opt_compile }, { "code-coverage", optional_argument, 0, opt_code_coverage }, { "track-allocation",optional_argument, 0, opt_track_allocation }, { "optimize", optional_argument, 0, 'O' }, { "check-bounds", required_argument, 0, opt_check_bounds }, { "output-bc", required_argument, 0, opt_output_bc }, { "output-o", required_argument, 0, opt_output_o }, { "output-ji", required_argument, 0, opt_output_ji }, { "output-incremental",required_argument, 0, opt_incremental }, { "depwarn", required_argument, 0, opt_depwarn }, { "inline", required_argument, 0, opt_inline }, { "math-mode", required_argument, 0, opt_math_mode }, { "handle-signals", required_argument, 0, opt_handle_signals }, // hidden command line options { "worker", no_argument, 0, opt_worker }, { "bind-to", required_argument, 0, opt_bind_to }, { "lisp", no_argument, &lisp_prompt, 1 }, { 0, 0, 0, 0 } }; // getopt handles argument parsing up to -- delineator int argc = *argcp; char **argv = *argvp; if (argc > 0) { for (int i=0; i < argc; i++) { if (!strcmp(argv[i], "--")) { argc = i; break; } } } char *endptr; opterr = 0; // suppress getopt warning messages while (1) { int lastind = optind; int c = getopt_long(argc, argv, shortopts, longopts, 0); if (c == -1) break; restart_switch: switch (c) { case 0: break; case '?': case ':': if (optopt) { for (struct option *o = longopts; o->val; o++) { if (optopt == o->val) { if (o->has_arg == optional_argument) { c = o->val; goto restart_switch; } else if (strchr(shortopts, o->val)) { jl_errorf("option `-%c/--%s` is missing an argument", o->val, o->name); } else { jl_errorf("option `--%s` is missing an argument", o->name); } } } jl_errorf("unknown option `-%c`", optopt); } else { jl_errorf("unknown option `%s`", argv[lastind]); } break; case 'v': // version jl_printf(JL_STDOUT, "julia version %s\n", JULIA_VERSION_STRING); jl_exit(0); case 'h': // help jl_printf(JL_STDOUT, "%s%s", usage, opts); jl_exit(0); case 'q': // quiet jl_options.quiet = 1; break; case 'H': // home jl_options.julia_home = strdup(optarg); break; case 'e': // eval jl_options.eval = strdup(optarg); break; case 'E': // print jl_options.print = strdup(optarg); break; case 'P': // post-boot jl_options.postboot = strdup(optarg); break; case 'L': // load jl_options.load = strdup(optarg); break; case 'J': // sysimage jl_options.image_file = strdup(optarg); imagepathspecified = 1; break; case opt_use_precompiled: if (!strcmp(optarg,"yes")) jl_options.use_precompiled = JL_OPTIONS_USE_PRECOMPILED_YES; else if (!strcmp(optarg,"no")) jl_options.use_precompiled = JL_OPTIONS_USE_PRECOMPILED_NO; else jl_errorf("julia: invalid argument to --precompiled={yes|no} (%s)", optarg); break; case opt_use_compilecache: if (!strcmp(optarg,"yes")) jl_options.use_compilecache = JL_OPTIONS_USE_COMPILECACHE_YES; else if (!strcmp(optarg,"no")) jl_options.use_compilecache = JL_OPTIONS_USE_COMPILECACHE_NO; else jl_errorf("julia: invalid argument to --compilecache={yes|no} (%s)", optarg); break; case 'C': // cpu-target jl_options.cpu_target = strdup(optarg); break; case 'p': // procs errno = 0; if (!strcmp(optarg,"auto")) { jl_options.nprocs = jl_cpu_cores(); } else { long nprocs = strtol(optarg, &endptr, 10); if (errno != 0 || optarg == endptr || *endptr != 0 || nprocs < 1 || nprocs >= INT_MAX) jl_errorf("julia: -p,--procs=<n> must be an integer >= 1"); jl_options.nprocs = (int)nprocs; } break; case opt_machinefile: jl_options.machinefile = strdup(optarg); break; case opt_color: if (!strcmp(optarg,"yes")) jl_options.color = JL_OPTIONS_COLOR_ON; else if (!strcmp(optarg,"no")) jl_options.color = JL_OPTIONS_COLOR_OFF; else jl_errorf("julia: invalid argument to --color={yes|no} (%s)", optarg); break; case opt_history_file: if (!strcmp(optarg,"yes")) jl_options.historyfile = JL_OPTIONS_HISTORYFILE_ON; else if (!strcmp(optarg,"no")) jl_options.historyfile = JL_OPTIONS_HISTORYFILE_OFF; else jl_errorf("julia: invalid argument to --history-file={yes|no} (%s)", optarg); break; case opt_no_history_file: jl_options.historyfile = JL_OPTIONS_HISTORYFILE_OFF; break; case opt_startup_file: if (!strcmp(optarg,"yes")) jl_options.startupfile = JL_OPTIONS_STARTUPFILE_ON; else if (!strcmp(optarg,"no")) jl_options.startupfile = JL_OPTIONS_STARTUPFILE_OFF; else jl_errorf("julia: invalid argument to --startup-file={yes|no} (%s)", optarg); break; case 'f': jl_options.startupfile = JL_OPTIONS_STARTUPFILE_OFF; break; case 'F': jl_options.startupfile = JL_OPTIONS_STARTUPFILE_ON; break; case opt_compile: if (!strcmp(optarg,"yes")) jl_options.compile_enabled = JL_OPTIONS_COMPILE_ON; else if (!strcmp(optarg,"no")) jl_options.compile_enabled = JL_OPTIONS_COMPILE_OFF; else if (!strcmp(optarg,"all")) jl_options.compile_enabled = JL_OPTIONS_COMPILE_ALL; else if (!strcmp(optarg,"min")) jl_options.compile_enabled = JL_OPTIONS_COMPILE_MIN; else jl_errorf("julia: invalid argument to --compile (%s)", optarg); break; case opt_code_coverage: if (optarg != NULL) { if (!strcmp(optarg,"user")) codecov = JL_LOG_USER; else if (!strcmp(optarg,"all")) codecov = JL_LOG_ALL; else if (!strcmp(optarg,"none")) codecov = JL_LOG_NONE; else jl_errorf("julia: invalid argument to --code-coverage (%s)", optarg); break; } else { codecov = JL_LOG_USER; } break; case opt_track_allocation: if (optarg != NULL) { if (!strcmp(optarg,"user")) malloclog = JL_LOG_USER; else if (!strcmp(optarg,"all")) malloclog = JL_LOG_ALL; else if (!strcmp(optarg,"none")) malloclog = JL_LOG_NONE; else jl_errorf("julia: invalid argument to --track-allocation (%s)", optarg); break; } else { malloclog = JL_LOG_USER; } break; case 'O': // optimize if (optarg != NULL) { if (!strcmp(optarg,"0")) jl_options.opt_level = 0; else if (!strcmp(optarg,"1")) jl_options.opt_level = 1; else if (!strcmp(optarg,"2")) jl_options.opt_level = 2; else if (!strcmp(optarg,"3")) jl_options.opt_level = 3; else jl_errorf("julia: invalid argument to -O (%s)", optarg); break; } else { jl_options.opt_level = 3; } break; case 'i': // isinteractive jl_options.isinteractive = 1; break; case opt_check_bounds: if (!strcmp(optarg,"yes")) jl_options.check_bounds = JL_OPTIONS_CHECK_BOUNDS_ON; else if (!strcmp(optarg,"no")) jl_options.check_bounds = JL_OPTIONS_CHECK_BOUNDS_OFF; else jl_errorf("julia: invalid argument to --check-bounds={yes|no} (%s)", optarg); break; case opt_output_bc: jl_options.outputbc = optarg; if (!imagepathspecified) jl_options.image_file = NULL; break; case opt_output_o: jl_options.outputo = optarg; if (!imagepathspecified) jl_options.image_file = NULL; break; case opt_output_ji: jl_options.outputji = optarg; if (!imagepathspecified) jl_options.image_file = NULL; break; case opt_incremental: if (!strcmp(optarg,"yes")) jl_options.incremental = 1; else if (!strcmp(optarg,"no")) jl_options.incremental = 0; else jl_errorf("julia: invalid argument to --output-incremental={yes|no} (%s)", optarg); break; case opt_depwarn: if (!strcmp(optarg,"yes")) jl_options.depwarn = JL_OPTIONS_DEPWARN_ON; else if (!strcmp(optarg,"no")) jl_options.depwarn = JL_OPTIONS_DEPWARN_OFF; else if (!strcmp(optarg,"error")) jl_options.depwarn = JL_OPTIONS_DEPWARN_ERROR; else jl_errorf("julia: invalid argument to --depwarn={yes|no|error} (%s)", optarg); break; case opt_inline: if (!strcmp(optarg,"yes")) jl_options.can_inline = 1; else if (!strcmp(optarg,"no")) jl_options.can_inline = 0; else { jl_errorf("julia: invalid argument to --inline (%s)", optarg); } break; case opt_math_mode: if (!strcmp(optarg,"ieee")) jl_options.fast_math = JL_OPTIONS_FAST_MATH_OFF; else if (!strcmp(optarg,"fast")) jl_options.fast_math = JL_OPTIONS_FAST_MATH_ON; else if (!strcmp(optarg,"user")) jl_options.fast_math = JL_OPTIONS_FAST_MATH_DEFAULT; else jl_errorf("julia: invalid argument to --math-mode (%s)", optarg); break; case opt_worker: jl_options.worker = 1; break; case opt_bind_to: jl_options.bindto = strdup(optarg); break; case opt_handle_signals: if (!strcmp(optarg,"yes")) jl_options.handle_signals = JL_OPTIONS_HANDLE_SIGNALS_ON; else if (!strcmp(optarg,"no")) jl_options.handle_signals = JL_OPTIONS_HANDLE_SIGNALS_OFF; else jl_errorf("julia: invalid argument to --handle-signals (%s)", optarg); break; default: jl_errorf("julia: unhandled option -- %c\n" "This is a bug, please report it.", c); } } jl_options.code_coverage = codecov; jl_options.malloc_log = malloclog; *argvp += optind; *argcp -= optind; }
void julia_init(char *imageFile) { jl_page_size = jl_getpagesize(); jl_find_stack_bottom(); jl_dl_handle = jl_load_dynamic_library(NULL, JL_RTLD_DEFAULT); #ifdef _OS_WINDOWS_ uv_dlopen("ntdll.dll",jl_ntdll_handle); //bypass julia's pathchecking for system dlls uv_dlopen("Kernel32.dll",jl_kernel32_handle); uv_dlopen("msvcrt.dll",jl_crtdll_handle); uv_dlopen("Ws2_32.dll",jl_winsock_handle); _jl_exe_handle.handle = GetModuleHandleA(NULL); if (!DuplicateHandle( GetCurrentProcess(), GetCurrentThread(), GetCurrentProcess(), (PHANDLE)&hMainThread, 0, TRUE, DUPLICATE_SAME_ACCESS )) { JL_PRINTF(JL_STDERR, "Couldn't access handle to main thread\n"); } #if defined(_CPU_X86_64_) SymSetOptions(SYMOPT_UNDNAME | SYMOPT_DEFERRED_LOADS); SymInitialize(GetCurrentProcess(), NULL, 1); needsSymRefreshModuleList = 0; #endif #endif jl_io_loop = uv_default_loop(); //this loop will internal events (spawining process etc.) init_stdio(); #if defined(__linux__) int ncores = jl_cpu_cores(); if (ncores > 1) { cpu_set_t cpumask; CPU_ZERO(&cpumask); for(int i=0; i < ncores; i++) { CPU_SET(i, &cpumask); } sched_setaffinity(0, sizeof(cpu_set_t), &cpumask); } #endif #ifdef JL_GC_MARKSWEEP jl_gc_init(); jl_gc_disable(); #endif jl_init_frontend(); jl_init_types(); jl_init_tasks(jl_stack_lo, jl_stack_hi-jl_stack_lo); jl_init_codegen(); jl_an_empty_cell = (jl_value_t*)jl_alloc_cell_1d(0); jl_init_serializer(); if (!imageFile) { jl_main_module = jl_new_module(jl_symbol("Main")); jl_main_module->parent = jl_main_module; jl_core_module = jl_new_module(jl_symbol("Core")); jl_core_module->parent = jl_main_module; jl_set_const(jl_main_module, jl_symbol("Core"), (jl_value_t*)jl_core_module); jl_module_using(jl_main_module, jl_core_module); jl_current_module = jl_core_module; jl_init_intrinsic_functions(); jl_init_primitives(); jl_load("boot.jl"); jl_get_builtin_hooks(); jl_boot_file_loaded = 1; jl_init_box_caches(); } if (imageFile) { JL_TRY { jl_restore_system_image(imageFile); } JL_CATCH { JL_PRINTF(JL_STDERR, "error during init:\n"); jl_show(jl_stderr_obj(), jl_exception_in_transit); JL_PRINTF(JL_STDERR, "\n"); jl_exit(1); } } // set module field of primitive types int i; void **table = jl_core_module->bindings.table; for(i=1; i < jl_core_module->bindings.size; i+=2) { if (table[i] != HT_NOTFOUND) { jl_binding_t *b = (jl_binding_t*)table[i]; if (b->value && jl_is_datatype(b->value)) { jl_datatype_t *tt = (jl_datatype_t*)b->value; tt->name->module = jl_core_module; } } } // the Main module is the one which is always open, and set as the // current module for bare (non-module-wrapped) toplevel expressions. // it does "using Base" if Base is available. if (jl_base_module != NULL) { jl_add_standard_imports(jl_main_module); } // eval() uses Main by default, so Main.eval === Core.eval jl_module_import(jl_main_module, jl_core_module, jl_symbol("eval")); jl_current_module = jl_main_module; #ifndef _OS_WINDOWS_ signal_stack = malloc(SIGSTKSZ); struct sigaction actf; memset(&actf, 0, sizeof(struct sigaction)); sigemptyset(&actf.sa_mask); actf.sa_handler = fpe_handler; actf.sa_flags = 0; if (sigaction(SIGFPE, &actf, NULL) < 0) { JL_PRINTF(JL_STDERR, "sigaction: %s\n", strerror(errno)); jl_exit(1); } #if defined(_OS_LINUX_) stack_t ss; ss.ss_flags = 0; ss.ss_size = SIGSTKSZ; ss.ss_sp = signal_stack; if (sigaltstack(&ss, NULL) < 0) { JL_PRINTF(JL_STDERR, "sigaltstack: %s\n", strerror(errno)); jl_exit(1); } struct sigaction act; memset(&act, 0, sizeof(struct sigaction)); sigemptyset(&act.sa_mask); act.sa_sigaction = segv_handler; act.sa_flags = SA_ONSTACK | SA_SIGINFO; if (sigaction(SIGSEGV, &act, NULL) < 0) { JL_PRINTF(JL_STDERR, "sigaction: %s\n", strerror(errno)); jl_exit(1); } if (signal(SIGPIPE,SIG_IGN) == SIG_ERR) { JL_PRINTF(JL_STDERR, "Couldn't set SIGPIPE\n"); jl_exit(1); } #elif defined (_OS_DARWIN_) kern_return_t ret; mach_port_t self = mach_task_self(); ret = mach_port_allocate(self,MACH_PORT_RIGHT_RECEIVE,&segv_port); HANDLE_MACH_ERROR("mach_port_allocate",ret); ret = mach_port_insert_right(self,segv_port,segv_port,MACH_MSG_TYPE_MAKE_SEND); HANDLE_MACH_ERROR("mach_port_insert_right",ret); // Alright, create a thread to serve as the listener for exceptions pthread_t thread; pthread_attr_t attr; if (pthread_attr_init(&attr) != 0) { JL_PRINTF(JL_STDERR, "pthread_attr_init failed"); jl_exit(1); } pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED); if (pthread_create(&thread,&attr,mach_segv_listener,NULL) != 0) { JL_PRINTF(JL_STDERR, "pthread_create failed"); jl_exit(1); } pthread_attr_destroy(&attr); ret = task_set_exception_ports(self,EXC_MASK_BAD_ACCESS,segv_port,EXCEPTION_DEFAULT,MACHINE_THREAD_STATE); HANDLE_MACH_ERROR("task_set_exception_ports",ret); #endif #else if (signal(SIGFPE, (void (__cdecl *)(int))fpe_handler) == SIG_ERR) { JL_PRINTF(JL_STDERR, "Couldn't set SIGFPE\n"); jl_exit(1); } #endif #ifdef JL_GC_MARKSWEEP jl_gc_enable(); #endif }
void parse_opts(int *argcp, char ***argvp) { enum { opt_machinefile = 300, opt_color, opt_history_file, opt_no_history_file, opt_startup_file, opt_compile, opt_code_coverage, opt_track_allocation, opt_check_bounds, opt_dump_bitcode, opt_depwarn, opt_inline, opt_math_mode, opt_worker, opt_bind_to, opt_handle_signals }; static char* shortopts = "+vhqFfH:e:E:P:L:J:C:ip:Ob:"; static struct option longopts[] = { // exposed command line options // NOTE: This set of required arguments need to be kept in sync // with the required arguments defined in base/client.jl `process_options()` { "version", no_argument, 0, 'v' }, { "help", no_argument, 0, 'h' }, { "quiet", no_argument, 0, 'q' }, { "home", required_argument, 0, 'H' }, { "eval", required_argument, 0, 'e' }, { "print", required_argument, 0, 'E' }, { "post-boot", required_argument, 0, 'P' }, { "load", required_argument, 0, 'L' }, { "sysimage", required_argument, 0, 'J' }, { "cpu-target", required_argument, 0, 'C' }, { "procs", required_argument, 0, 'p' }, { "machinefile", required_argument, 0, opt_machinefile }, { "color", required_argument, 0, opt_color }, { "history-file", required_argument, 0, opt_history_file }, { "no-history-file", no_argument, 0, opt_no_history_file }, // deprecated { "startup-file", required_argument, 0, opt_startup_file }, { "no-startup", no_argument, 0, 'f' }, // deprecated { "compile", required_argument, 0, opt_compile }, { "code-coverage", optional_argument, 0, opt_code_coverage }, { "track-allocation",optional_argument, 0, opt_track_allocation }, { "optimize", no_argument, 0, 'O' }, { "check-bounds", required_argument, 0, opt_check_bounds }, { "dump-bitcode", required_argument, 0, opt_dump_bitcode }, { "depwarn", required_argument, 0, opt_depwarn }, { "inline", required_argument, 0, opt_inline }, { "math-mode", required_argument, 0, opt_math_mode }, { "handle-signals", required_argument, 0, opt_handle_signals }, // hidden command line options { "build", required_argument, 0, 'b' }, { "worker", no_argument, 0, opt_worker }, { "bind-to", required_argument, 0, opt_bind_to }, { "lisp", no_argument, &lisp_prompt, 1 }, { 0, 0, 0, 0 } }; // getopt handles argument parsing up to -- delineator int lastind = optind; int argc = *argcp; if (argc > 0) { for (int i=0; i < argc; i++) { if (!strcmp((*argvp)[i], "--")) { argc = i; break; } } } int c; char *endptr; opterr = 0; int skip = 0; while ((c = getopt_long(argc,*argvp,shortopts,longopts,0)) != -1) { switch (c) { case 0: break; case '?': if (optind != lastind) skip++; lastind = optind; break; case 'v': // version jl_printf(JL_STDOUT, "julia version %s\n", JULIA_VERSION_STRING); jl_exit(0); case 'h': // help jl_printf(JL_STDOUT, "%s%s", usage, opts); jl_exit(0); case 'q': // quiet jl_options.quiet = 1; break; case 'H': // home jl_options.julia_home = strdup(optarg); break; case 'e': // eval jl_options.eval = strdup(optarg); break; case 'E': // print jl_options.print = strdup(optarg); break; case 'P': // post-boot jl_options.postboot = strdup(optarg); break; case 'L': // load jl_options.load = strdup(optarg); break; case 'J': // sysimage jl_options.image_file = strdup(optarg); imagepathspecified = 1; break; case 'C': // cpu-target jl_options.cpu_target = strdup(optarg); break; case 'p': // procs errno = 0; if (!strcmp(optarg,"auto")) { jl_options.nprocs = jl_cpu_cores(); } else { long nprocs = strtol(optarg, &endptr, 10); if (errno != 0 || optarg == endptr || *endptr != 0 || nprocs < 1 || nprocs >= INT_MAX) jl_errorf("julia: -p,--procs=<n> must be an integer >= 1\n"); jl_options.nprocs = (int)nprocs; } break; case opt_machinefile: jl_options.machinefile = strdup(optarg); break; case opt_color: if (!strcmp(optarg,"yes")) jl_options.color = JL_OPTIONS_COLOR_ON; else if (!strcmp(optarg,"no")) jl_options.color = JL_OPTIONS_COLOR_OFF; else jl_errorf("julia: invalid argument to --color={yes|no} (%s)\n", optarg); break; case opt_history_file: if (!strcmp(optarg,"yes")) jl_options.historyfile = JL_OPTIONS_HISTORYFILE_ON; else if (!strcmp(optarg,"no")) jl_options.historyfile = JL_OPTIONS_HISTORYFILE_OFF; else jl_errorf("julia: invalid argument to --history-file={yes|no} (%s)\n", optarg); break; case opt_no_history_file: jl_options.historyfile = JL_OPTIONS_HISTORYFILE_OFF; break; case opt_startup_file: if (!strcmp(optarg,"yes")) jl_options.startupfile = JL_OPTIONS_STARTUPFILE_ON; else if (!strcmp(optarg,"no")) jl_options.startupfile = JL_OPTIONS_STARTUPFILE_OFF; else jl_errorf("julia: invalid argument to --startup-file={yes|no} (%s)\n", optarg); break; case 'f': jl_options.startupfile = JL_OPTIONS_STARTUPFILE_OFF; break; case 'F': jl_options.startupfile = JL_OPTIONS_STARTUPFILE_ON; break; case opt_compile: if (!strcmp(optarg,"yes")) jl_options.compile_enabled = JL_OPTIONS_COMPILE_ON; else if (!strcmp(optarg,"no")) jl_options.compile_enabled = JL_OPTIONS_COMPILE_OFF; else if (!strcmp(optarg,"all")) jl_options.compile_enabled = JL_OPTIONS_COMPILE_ALL; else jl_errorf("julia: invalid argument to --compile (%s)\n", optarg); break; case opt_code_coverage: if (optarg != NULL) { if (!strcmp(optarg,"user")) codecov = JL_LOG_USER; else if (!strcmp(optarg,"all")) codecov = JL_LOG_ALL; else if (!strcmp(optarg,"none")) codecov = JL_LOG_NONE; break; } else { codecov = JL_LOG_USER; } break; case opt_track_allocation: if (optarg != NULL) { if (!strcmp(optarg,"user")) malloclog = JL_LOG_USER; else if (!strcmp(optarg,"all")) malloclog = JL_LOG_ALL; else if (!strcmp(optarg,"none")) malloclog = JL_LOG_NONE; break; } else { malloclog = JL_LOG_USER; } break; case 'O': // optimize jl_options.opt_level = 1; break; case 'i': // isinteractive jl_options.isinteractive = 1; break; case opt_check_bounds: if (!strcmp(optarg,"yes")) jl_options.check_bounds = JL_OPTIONS_CHECK_BOUNDS_ON; else if (!strcmp(optarg,"no")) jl_options.check_bounds = JL_OPTIONS_CHECK_BOUNDS_OFF; else jl_errorf("julia: invalid argument to --check-bounds={yes|no} (%s)\n", optarg); break; case opt_dump_bitcode: if (!strcmp(optarg,"yes")) jl_options.dumpbitcode = JL_OPTIONS_DUMPBITCODE_ON; else if (!strcmp(optarg,"no")) jl_options.dumpbitcode = JL_OPTIONS_DUMPBITCODE_OFF; break; case opt_depwarn: if (!strcmp(optarg,"yes")) jl_options.depwarn = 1; else if (!strcmp(optarg,"no")) jl_options.depwarn = 0; else jl_errorf("julia: invalid argument to --depwarn={yes|no} (%s)\n", optarg); break; case opt_inline: if (!strcmp(optarg,"yes")) jl_options.can_inline = 1; else if (!strcmp(optarg,"no")) jl_options.can_inline = 0; else { jl_errorf("julia: invalid argument to --inline (%s)\n", optarg); } break; case opt_math_mode: if (!strcmp(optarg,"ieee")) jl_options.fast_math = JL_OPTIONS_FAST_MATH_OFF; else if (!strcmp(optarg,"fast")) jl_options.fast_math = JL_OPTIONS_FAST_MATH_ON; else if (!strcmp(optarg,"user")) jl_options.fast_math = JL_OPTIONS_FAST_MATH_DEFAULT; else jl_errorf("julia: invalid argument to --math-mode (%s)\n", optarg); break; case 'b': // build jl_options.build_path = strdup(optarg); if (!imagepathspecified) jl_options.image_file = NULL; break; case opt_worker: jl_options.worker = 1; break; case opt_bind_to: jl_options.bindto = strdup(optarg); break; case opt_handle_signals: if (!strcmp(optarg,"yes")) jl_options.handle_signals = JL_OPTIONS_HANDLE_SIGNALS_ON; else if (!strcmp(optarg,"no")) jl_options.handle_signals = JL_OPTIONS_HANDLE_SIGNALS_OFF; else jl_errorf("julia: invalid argument to --handle-signals (%s)\n", optarg); break; default: jl_errorf("julia: unhandled option -- %c\n" "This is a bug, please report it.\n", c); } } jl_options.code_coverage = codecov; jl_options.malloc_log = malloclog; optind -= skip; *argvp += optind; *argcp -= optind; }
void julia_init(char *imageFile) { (void)uv_default_loop(); restore_signals(); //XXX: this needs to be early in load process jl_page_size = sysconf(_SC_PAGESIZE); jl_find_stack_bottom(); jl_dl_handle = jl_load_dynamic_library(NULL); #if defined(__linux__) int ncores = jl_cpu_cores(); if (ncores > 1) { cpu_set_t cpumask; CPU_ZERO(&cpumask); for(int i=0; i < ncores; i++) { CPU_SET(i, &cpumask); } sched_setaffinity(0, sizeof(cpu_set_t), &cpumask); } #endif #ifdef JL_GC_MARKSWEEP jl_gc_init(); jl_gc_disable(); #endif jl_init_frontend(); jl_init_types(); jl_init_tasks(jl_stack_lo, jl_stack_hi-jl_stack_lo); jl_init_codegen(); jl_an_empty_cell = (jl_value_t*)jl_alloc_cell_1d(0); jl_init_serializer(); if (!imageFile) { jl_main_module = jl_new_module(jl_symbol("Main")); jl_main_module->parent = jl_main_module; jl_core_module = jl_new_module(jl_symbol("Core")); jl_core_module->parent = jl_main_module; jl_set_const(jl_main_module, jl_symbol("Core"), (jl_value_t*)jl_core_module); jl_module_using(jl_main_module, jl_core_module); jl_current_module = jl_core_module; jl_init_intrinsic_functions(); jl_init_primitives(); jl_load("boot.jl"); jl_get_builtin_hooks(); jl_boot_file_loaded = 1; jl_init_box_caches(); } if (imageFile) { JL_TRY { jl_restore_system_image(imageFile); } JL_CATCH { JL_PRINTF(JL_STDERR, "error during init:\n"); jl_show(jl_stderr_obj(), jl_exception_in_transit); JL_PRINTF(JL_STDOUT, "\n"); jl_exit(1); } } // set module field of primitive types int i; void **table = jl_core_module->bindings.table; for(i=1; i < jl_core_module->bindings.size; i+=2) { if (table[i] != HT_NOTFOUND) { jl_binding_t *b = (jl_binding_t*)table[i]; if (b->value && jl_is_some_tag_type(b->value)) { jl_tag_type_t *tt = (jl_tag_type_t*)b->value; tt->name->module = jl_core_module; } } } // the Main module is the one which is always open, and set as the // current module for bare (non-module-wrapped) toplevel expressions. // it does "using Base" if Base is available. if (jl_base_module != NULL) jl_module_using(jl_main_module, jl_base_module); jl_current_module = jl_main_module; #ifndef __WIN32__ struct sigaction actf; memset(&actf, 0, sizeof(struct sigaction)); sigemptyset(&actf.sa_mask); actf.sa_handler = fpe_handler; actf.sa_flags = 0; if (sigaction(SIGFPE, &actf, NULL) < 0) { JL_PRINTF(JL_STDERR, "sigaction: %s\n", strerror(errno)); jl_exit(1); } stack_t ss; ss.ss_flags = 0; ss.ss_size = SIGSTKSZ; ss.ss_sp = malloc(ss.ss_size); if (sigaltstack(&ss, NULL) < 0) { JL_PRINTF(JL_STDERR, "sigaltstack: %s\n", strerror(errno)); jl_exit(1); } struct sigaction act; memset(&act, 0, sizeof(struct sigaction)); sigemptyset(&act.sa_mask); act.sa_sigaction = segv_handler; act.sa_flags = SA_ONSTACK | SA_SIGINFO; if (sigaction(SIGSEGV, &act, NULL) < 0) { JL_PRINTF(JL_STDERR, "sigaction: %s\n", strerror(errno)); jl_exit(1); } #endif atexit(jl_atexit_hook); #ifdef JL_GC_MARKSWEEP jl_gc_enable(); #endif }
JL_DLLEXPORT void jl_parse_opts(int *argcp, char ***argvp) { enum { opt_machinefile = 300, opt_color, opt_history_file, opt_startup_file, opt_compile, opt_code_coverage, opt_track_allocation, opt_check_bounds, opt_output_jit_bc, opt_output_unopt_bc, opt_output_bc, opt_depwarn, opt_warn_overwrite, opt_inline, opt_polly, opt_math_mode, opt_worker, opt_bind_to, opt_handle_signals, opt_output_o, opt_output_ji, opt_use_precompiled, opt_use_compilecache, opt_incremental, opt_banner, opt_sysimage_native_code, opt_compiled_modules, opt_machine_file, }; static const char* const shortopts = "+vhqH:e:E:L:J:C:ip:O:g:"; static const struct option longopts[] = { // exposed command line options // NOTE: This set of required arguments need to be kept in sync // with the required arguments defined in base/client.jl `process_options()` { "version", no_argument, 0, 'v' }, { "help", no_argument, 0, 'h' }, { "quiet", no_argument, 0, 'q' }, { "banner", required_argument, 0, opt_banner }, { "home", required_argument, 0, 'H' }, { "eval", required_argument, 0, 'e' }, { "print", required_argument, 0, 'E' }, { "load", required_argument, 0, 'L' }, { "sysimage", required_argument, 0, 'J' }, { "precompiled", required_argument, 0, opt_use_precompiled }, // deprecated { "sysimage-native-code", required_argument, 0, opt_sysimage_native_code }, { "compilecache", required_argument, 0, opt_use_compilecache }, // deprecated { "compiled-modules", required_argument, 0, opt_compiled_modules }, { "cpu-target", required_argument, 0, 'C' }, { "procs", required_argument, 0, 'p' }, { "machinefile", required_argument, 0, opt_machinefile }, // deprecated { "machine-file", required_argument, 0, opt_machine_file }, { "color", required_argument, 0, opt_color }, { "history-file", required_argument, 0, opt_history_file }, { "startup-file", required_argument, 0, opt_startup_file }, { "compile", required_argument, 0, opt_compile }, { "code-coverage", optional_argument, 0, opt_code_coverage }, { "track-allocation",optional_argument, 0, opt_track_allocation }, { "optimize", optional_argument, 0, 'O' }, { "check-bounds", required_argument, 0, opt_check_bounds }, { "output-bc", required_argument, 0, opt_output_bc }, { "output-unopt-bc", required_argument, 0, opt_output_unopt_bc }, { "output-jit-bc", required_argument, 0, opt_output_jit_bc }, { "output-o", required_argument, 0, opt_output_o }, { "output-ji", required_argument, 0, opt_output_ji }, { "output-incremental",required_argument, 0, opt_incremental }, { "depwarn", required_argument, 0, opt_depwarn }, { "warn-overwrite", required_argument, 0, opt_warn_overwrite }, { "inline", required_argument, 0, opt_inline }, { "polly", required_argument, 0, opt_polly }, { "math-mode", required_argument, 0, opt_math_mode }, { "handle-signals", required_argument, 0, opt_handle_signals }, // hidden command line options { "worker", optional_argument, 0, opt_worker }, { "bind-to", required_argument, 0, opt_bind_to }, { "lisp", no_argument, 0, 1 }, { 0, 0, 0, 0 } }; // If CPUID specific binaries are enabled, this varies between runs, so initialize // it here, rather than as part of the static initialization above. jl_options.image_file = jl_get_default_sysimg_path(); jl_options.cmds = NULL; int ncmds = 0; const char **cmds = NULL; int codecov = JL_LOG_NONE; int malloclog = JL_LOG_NONE; // getopt handles argument parsing up to -- delineator int argc = *argcp; char **argv = *argvp; if (argc > 0) { for (int i = 0; i < argc; i++) { if (!strcmp(argv[i], "--")) { argc = i; break; } } } char *endptr; opterr = 0; // suppress getopt warning messages while (1) { int lastind = optind; int c = getopt_long(argc, argv, shortopts, longopts, 0); if (c == -1) break; restart_switch: switch (c) { case 0: break; case 1: jl_errorf("--lisp must be specified as the first argument"); break; case '?': case ':': if (optopt) { if (optopt == 'g') { c = 'g'; goto restart_switch; } for (const struct option *o = longopts; o->val; o++) { if (optopt == o->val) { if (o->has_arg == optional_argument) { c = o->val; goto restart_switch; } else if (strchr(shortopts, o->val)) { jl_errorf("option `-%c/--%s` is missing an argument", o->val, o->name); } else { jl_errorf("option `--%s` is missing an argument", o->name); } } } jl_errorf("unknown option `-%c`", optopt); } else { jl_errorf("unknown option `%s`", argv[lastind]); } break; case 'v': // version jl_printf(JL_STDOUT, "julia version %s\n", JULIA_VERSION_STRING); jl_exit(0); case 'h': // help jl_printf(JL_STDOUT, "%s%s", usage, opts); jl_exit(0); case 'g': // debug info if (optarg != NULL) { if (!strcmp(optarg,"0")) jl_options.debug_level = 0; else if (!strcmp(optarg,"1")) jl_options.debug_level = 1; else if (!strcmp(optarg,"2")) jl_options.debug_level = 2; else jl_errorf("julia: invalid argument to -g (%s)", optarg); break; } else { jl_options.debug_level = 2; } break; case 'H': // home jl_options.julia_bindir = strdup(optarg); if (!jl_options.julia_bindir) jl_errorf("fatal error: failed to allocate memory: %s", strerror(errno)); break; case 'e': // eval case 'E': // print case 'L': // load { size_t sz = strlen(optarg) + 1; char *arg = (char*)malloc(sz + 1); const char **newcmds; if (!arg) jl_errorf("fatal error: failed to allocate memory: %s", strerror(errno)); arg[0] = c; memcpy(arg + 1, optarg, sz); newcmds = (const char**)realloc(cmds, (ncmds + 2) * sizeof(char*)); if (!newcmds) { free(cmds); jl_errorf("fatal error: failed to allocate memory: %s", strerror(errno)); } cmds = newcmds; cmds[ncmds] = arg; ncmds++; cmds[ncmds] = 0; jl_options.cmds = cmds; break; } case 'J': // sysimage jl_options.image_file = strdup(optarg); if (!jl_options.image_file) jl_errorf("fatal error: failed to allocate memory: %s", strerror(errno)); jl_options.image_file_specified = 1; break; case 'q': // quiet jl_options.quiet = 1; if (jl_options.banner < 0) jl_options.banner = 0; break; case opt_banner: // banner if (!strcmp(optarg, "yes")) jl_options.banner = 1; else if (!strcmp(optarg, "no")) jl_options.banner = 0; else if (!strcmp(optarg, "auto")) jl_options.banner = -1; else jl_errorf("julia: invalid argument to --banner={yes|no|auto} (%s)", optarg); break; case opt_use_precompiled: jl_printf(JL_STDOUT, "WARNING: julia --precompiled option is deprecated, use --sysimage-native-code instead.\n"); // fall through case opt_sysimage_native_code: if (!strcmp(optarg,"yes")) jl_options.use_sysimage_native_code = JL_OPTIONS_USE_SYSIMAGE_NATIVE_CODE_YES; else if (!strcmp(optarg,"no")) jl_options.use_sysimage_native_code = JL_OPTIONS_USE_SYSIMAGE_NATIVE_CODE_NO; else jl_errorf("julia: invalid argument to --sysimage-native-code={yes|no} (%s)", optarg); break; case opt_use_compilecache: jl_printf(JL_STDOUT, "WARNING: julia --compilecache option is deprecated, use --compiled-modules instead.\n"); // fall through case opt_compiled_modules: if (!strcmp(optarg,"yes")) jl_options.use_compiled_modules = JL_OPTIONS_USE_COMPILED_MODULES_YES; else if (!strcmp(optarg,"no")) jl_options.use_compiled_modules = JL_OPTIONS_USE_COMPILED_MODULES_NO; else jl_errorf("julia: invalid argument to --compiled-modules={yes|no} (%s)", optarg); break; case 'C': // cpu-target jl_options.cpu_target = strdup(optarg); if (!jl_options.cpu_target) jl_error("julia: failed to allocate memory"); break; case 'p': // procs errno = 0; if (!strcmp(optarg,"auto")) { jl_options.nprocs = jl_cpu_cores(); } else { long nprocs = strtol(optarg, &endptr, 10); if (errno != 0 || optarg == endptr || *endptr != 0 || nprocs < 1 || nprocs >= INT_MAX) jl_errorf("julia: -p,--procs=<n> must be an integer >= 1"); jl_options.nprocs = (int)nprocs; } break; case opt_machinefile: jl_printf(JL_STDOUT, "WARNING: julia --machinefile option is deprecated, use --machine-file instead.\n"); // fall through case opt_machine_file: jl_options.machine_file = strdup(optarg); if (!jl_options.machine_file) jl_error("julia: failed to allocate memory"); break; case opt_color: if (!strcmp(optarg, "yes")) jl_options.color = JL_OPTIONS_COLOR_ON; else if (!strcmp(optarg, "no")) jl_options.color = JL_OPTIONS_COLOR_OFF; else if (!strcmp(optarg, "auto")) jl_options.color = JL_OPTIONS_COLOR_AUTO; else jl_errorf("julia: invalid argument to --color={yes|no|auto} (%s)", optarg); break; case opt_history_file: if (!strcmp(optarg,"yes")) jl_options.historyfile = JL_OPTIONS_HISTORYFILE_ON; else if (!strcmp(optarg,"no")) jl_options.historyfile = JL_OPTIONS_HISTORYFILE_OFF; else jl_errorf("julia: invalid argument to --history-file={yes|no} (%s)", optarg); break; case opt_startup_file: if (!strcmp(optarg,"yes")) jl_options.startupfile = JL_OPTIONS_STARTUPFILE_ON; else if (!strcmp(optarg,"no")) jl_options.startupfile = JL_OPTIONS_STARTUPFILE_OFF; else jl_errorf("julia: invalid argument to --startup-file={yes|no} (%s)", optarg); break; case opt_compile: if (!strcmp(optarg,"yes")) jl_options.compile_enabled = JL_OPTIONS_COMPILE_ON; else if (!strcmp(optarg,"no")) jl_options.compile_enabled = JL_OPTIONS_COMPILE_OFF; else if (!strcmp(optarg,"all")) jl_options.compile_enabled = JL_OPTIONS_COMPILE_ALL; else if (!strcmp(optarg,"min")) jl_options.compile_enabled = JL_OPTIONS_COMPILE_MIN; else jl_errorf("julia: invalid argument to --compile (%s)", optarg); break; case opt_code_coverage: if (optarg != NULL) { if (!strcmp(optarg,"user")) codecov = JL_LOG_USER; else if (!strcmp(optarg,"all")) codecov = JL_LOG_ALL; else if (!strcmp(optarg,"none")) codecov = JL_LOG_NONE; else jl_errorf("julia: invalid argument to --code-coverage (%s)", optarg); break; } else { codecov = JL_LOG_USER; } break; case opt_track_allocation: if (optarg != NULL) { if (!strcmp(optarg,"user")) malloclog = JL_LOG_USER; else if (!strcmp(optarg,"all")) malloclog = JL_LOG_ALL; else if (!strcmp(optarg,"none")) malloclog = JL_LOG_NONE; else jl_errorf("julia: invalid argument to --track-allocation (%s)", optarg); break; } else { malloclog = JL_LOG_USER; } break; case 'O': // optimize if (optarg != NULL) { if (!strcmp(optarg,"0")) jl_options.opt_level = 0; else if (!strcmp(optarg,"1")) jl_options.opt_level = 1; else if (!strcmp(optarg,"2")) jl_options.opt_level = 2; else if (!strcmp(optarg,"3")) jl_options.opt_level = 3; else jl_errorf("julia: invalid argument to -O (%s)", optarg); break; } else { jl_options.opt_level = 3; } break; case 'i': // isinteractive jl_options.isinteractive = 1; break; case opt_check_bounds: if (!strcmp(optarg,"yes")) jl_options.check_bounds = JL_OPTIONS_CHECK_BOUNDS_ON; else if (!strcmp(optarg,"no")) jl_options.check_bounds = JL_OPTIONS_CHECK_BOUNDS_OFF; else jl_errorf("julia: invalid argument to --check-bounds={yes|no} (%s)", optarg); break; case opt_output_bc: jl_options.outputbc = optarg; if (!jl_options.image_file_specified) jl_options.image_file = NULL; break; case opt_output_jit_bc: jl_options.outputjitbc = optarg; break; case opt_output_unopt_bc: jl_options.outputunoptbc = optarg; if (!jl_options.image_file_specified) jl_options.image_file = NULL; break; case opt_output_o: jl_options.outputo = optarg; if (!jl_options.image_file_specified) jl_options.image_file = NULL; break; case opt_output_ji: jl_options.outputji = optarg; if (!jl_options.image_file_specified) jl_options.image_file = NULL; break; case opt_incremental: if (!strcmp(optarg,"yes")) jl_options.incremental = 1; else if (!strcmp(optarg,"no")) jl_options.incremental = 0; else jl_errorf("julia: invalid argument to --output-incremental={yes|no} (%s)", optarg); break; case opt_depwarn: if (!strcmp(optarg,"yes")) jl_options.depwarn = JL_OPTIONS_DEPWARN_ON; else if (!strcmp(optarg,"no")) jl_options.depwarn = JL_OPTIONS_DEPWARN_OFF; else if (!strcmp(optarg,"error")) jl_options.depwarn = JL_OPTIONS_DEPWARN_ERROR; else jl_errorf("julia: invalid argument to --depwarn={yes|no|error} (%s)", optarg); break; case opt_warn_overwrite: if (!strcmp(optarg,"yes")) jl_options.warn_overwrite = JL_OPTIONS_WARN_OVERWRITE_ON; else if (!strcmp(optarg,"no")) jl_options.warn_overwrite = JL_OPTIONS_WARN_OVERWRITE_OFF; else jl_errorf("julia: invalid argument to --warn-overwrite={yes|no|} (%s)", optarg); break; case opt_inline: if (!strcmp(optarg,"yes")) jl_options.can_inline = 1; else if (!strcmp(optarg,"no")) jl_options.can_inline = 0; else { jl_errorf("julia: invalid argument to --inline (%s)", optarg); } break; case opt_polly: if (!strcmp(optarg,"yes")) jl_options.polly = JL_OPTIONS_POLLY_ON; else if (!strcmp(optarg,"no")) jl_options.polly = JL_OPTIONS_POLLY_OFF; else { jl_errorf("julia: invalid argument to --polly (%s)", optarg); } break; case opt_math_mode: if (!strcmp(optarg,"ieee")) jl_options.fast_math = JL_OPTIONS_FAST_MATH_OFF; else if (!strcmp(optarg,"fast")) jl_options.fast_math = JL_OPTIONS_FAST_MATH_ON; else if (!strcmp(optarg,"user")) jl_options.fast_math = JL_OPTIONS_FAST_MATH_DEFAULT; else jl_errorf("julia: invalid argument to --math-mode (%s)", optarg); break; case opt_worker: jl_options.worker = 1; if (optarg != NULL) { jl_options.cookie = strdup(optarg); if (!jl_options.cookie) jl_error("julia: failed to allocate memory"); } break; case opt_bind_to: jl_options.bindto = strdup(optarg); if (!jl_options.bindto) jl_error("julia: failed to allocate memory"); break; case opt_handle_signals: if (!strcmp(optarg,"yes")) jl_options.handle_signals = JL_OPTIONS_HANDLE_SIGNALS_ON; else if (!strcmp(optarg,"no")) jl_options.handle_signals = JL_OPTIONS_HANDLE_SIGNALS_OFF; else jl_errorf("julia: invalid argument to --handle-signals (%s)", optarg); break; default: jl_errorf("julia: unhandled option -- %c\n" "This is a bug, please report it.", c); } } jl_options.code_coverage = codecov; jl_options.malloc_log = malloclog; *argvp += optind; *argcp -= optind; }