summaryrefslogtreecommitdiff
AgeCommit message (Collapse)AuthorFilesLines
2018-08-24Fix bug in compile-alloc-frameAndy Wingo1-0/+1
* libguile/jit.c (compile_alloc_frame): Fix alloc-frame filling in of undefined values for when previous frame size was unknown.
2018-08-24Clear frame size after subr-call, return-valuesAndy Wingo1-0/+4
* libguile/jit.c (compile_return_values, compile_subr_call): Clear frame size.
2018-08-24Fix r12 register spec for lightning with sysv x86-64 ABIAndy Wingo1-2/+2
* libguile/lightning/lib/jit_x86.c (_rvs): Mark R12 as callee-save.
2018-08-2332-bit fix for emit_run_hookAndy Wingo1-1/+1
* libguile/jit.c (emit_run_hook): Use sign-extending load, as unsigned load doesn't exist on 32-bit targets.
2018-08-23Minor refactors to jit.cAndy Wingo1-179/+175
* libguile/jit.c (emit_direct_tail_call): Add FIXME. (emit_mov): Simplify implementation. (emit_branch_if_frame_locals_count_less_than): (emit_branch_if_frame_locals_count_eq): (emit_branch_if_frame_locals_count_greater_than): (emit_load_fp_slot): (emit_branch_if_immediate): (emit_load_heap_object_word): (emit_load_heap_object_tc): (emit_branch_if_heap_object_has_tc): (emit_branch_if_heap_object_not_tc): (emit_branch_if_heap_object_not_tc7): (emit_entry_trampoline): (emit_handle_interrupts_trampoline): (initialize_handle_interrupts_trampoline): (emit_free_variable_ref): Move later in the file.
2018-08-23Fix load width of get-ip-relative-addrAndy Wingo1-1/+4
* libguile/jit.c (emit_get_ip_relative_addr): Fix load width.
2018-08-23Fix in-tree buildsAndy Wingo1-1/+1
* libguile/Makefile.am (AM_CPPFLAGS): Use -iquote for $(builddir) instead of -I, to avoid having in-tree builds find libguile/poll.h for <poll.h>.
2018-08-23Optimizations to subr-callAndy Wingo1-5/+3
* libguile/jit.c (compile_subr_call): Optimizations.
2018-08-23Comments in the JITAndy Wingo1-0/+89
* libguile/jit.c: Add some overview comments.
2018-08-21Add $(builddir) to include path in libguile/Makefile.amDaniel Llorens1-1/+2
2018-08-20Add support for labels, and fix a bug in uadd/imm and usub/imm.Andy Wingo1-5/+18
* libguile/jit.c (add_inter_instruction_patch, compile, compute_mcode): Add support for labels. (compile_uadd_immediate, compile_usub_immediate): Fix cases where we were adding the wrong operand as an immediate.
2018-08-20Add out-of-line handle-interrupts trampoline stubAndy Wingo1-3/+38
* libguile/jit.c (emit_handle_interrupts_trampoline) (initialize_handle_interrupts_trampoline) (compile_handle_interrupts): Handle most of the slow case of handle-interrupts out-of-line, to avoid code bloat.
2018-08-20Tweak to instrument-entryAndy Wingo1-0/+8
* libguile/vm-engine.c (instrument-entry): Eagerly check if data->mcode is already set, and in that case just jump directly without checking the counter.
2018-08-20Fix frame popping in JITAndy Wingo1-14/+7
* libguile/jit.c (emit_entry_trampoline): Don't bother hackily trying to save registers; the "jit_frame" call handles that. (compile_return_values, compile_return_from_interrupt): Fix bug when computing previous FP: no need to add frame_overhead_slots. (emit_load_prev_fp_offset, emit_store_prev_fp_offset): Rename from emit_load_prev_frame_size, emit_store_prev_frame_size. (emit_push_frame): Adapt to emit_store_prev_frame_size. Don't subtract off the frame_overhead_slots. (scm_jit_enter_mcode): Comment out a printf for the time being.
2018-08-20JIT compilation tweaksAndy Wingo1-5/+19
* libguile/jit.c (emit_alloc_frame_for_sp, compile_current_thread): Fix some ldxr/ldxi stxr/stxi confusions. (compile_alloc_frame): Omit if the frame size is already correct. (compile, compute_mcode, scm_sys_jit_compile, scm_jit_enter_mcode): Add a bit more debugging.
2018-08-20Fix bounds on compiler-emitted JIT metadataAndy Wingo1-2/+2
* module/system/vm/assembler.scm (link-data): Fix relocation addend for JIT data bounds. I never get this right!
2018-08-20Fix default code allocator in LightningAndy Wingo1-0/+3
* libguile/lightning/lib/lightning.c (_jit_emit): The default code allocator will simply mmap a code buffer, try to emit into that buffer, and if it fails, try again with a larger buffer. However the buffer size starts at 0, for some reason. Why? I can't see the reason. Change the default to 4096. In the future we will need to implement our own allocator anyway so that we can pack multiple JIT runs in one page.
2018-08-20Manual JIT interface via %jit-compileAndy Wingo5-19/+171
* libguile/init.c (scm_i_init_guile): Call scm_init_jit (). * libguile/jit.c (enter_mcode, exit_mcode): New static members; code pointers for the JIT trampoline. (emit_exit): New helper. The Lightning tramp/frame mechanism that we use needs to exit via a jmp instead of a return. Adapt callers of jit_ret. (emit_entry_trampoline): Use the "frame" mechanism to enter the JIT. (compile1): Add missing "break" after case statements. Oops! (compile): Add prolog and "tramp" to compiled functions. (initialize_jit): New local routine to init the JIT on demand. (compute_mcode): New helper, to compile a function. (scm_sys_jit_compile): New function, exported to Scheme as %jit-compile. (scm_jit_compute_mcode): Return the existing mcode if the function is at the start. (scm_jit_enter_mcode): Call the enter_mcode trampoline. * libguile/jit.h (struct scm_jit_state): Declare, so we can make pointers to it. * libguile/threads.h (struct scm_thread): Add jit_state member. * libguile/threads.c (on_thread_exit): Free the jit state.
2018-08-19First implementation of a template JITAndy Wingo1-84/+2316
* libguile/jit.c: Implement most of a JIT. Untested and still needs to be wired up.
2018-08-19Expose scm_vm_builtin_ref internallyAndy Wingo2-1/+2
* libguile/vm-builtins.h: * libguile/vm.c (scm_vm_builtin_ref): Expose internally.
2018-08-19Add internal function mapping subr index to functionAndy Wingo2-2/+9
* libguile/gsubr.h: * libguile/gsubr.c (scm_subr_function_by_index): New internal function. (scm_subr_function): Use new function.
2018-08-17Add instrumentation to VM builtinsAndy Wingo6-63/+97
* libguile/intrinsics.h: Add "intrinsic" for handle-interrupts code. Unlike the other intrinsics, this one isn't a function. * libguile/programs.c (try_parse_arity): Add cases for instructions used in VM builtins. (scm_primitive_call_ip): Return #f if call-ip not found. * libguile/vm-engine.c (handle-interrupts): Get code from intrinsics. * libguile/vm.c * libguile/vm.c (instrumented_code, define_vm_builtins): Add instrumentation to the builtins, so that they can be JIT-compiled. (INIT_BUILTIN): Remove min-arity setting; the fallback min-arity interpreter should figure it out. (scm_bootstrap_vm): Call the new define_vm_builtins function. * libguile/gsubr.c (primitive_call_ip): Return 0 if call IP not found. (primitive_subr_idx): Interpret call ip == 0 as not-a-subr. * module/system/vm/program.scm (program-arguments-alist): Allow a #f call-ip.
2018-08-13Define intrinsics for atomic opsAndy Wingo3-7/+45
* libguile/intrinsics.h: * libguile/intrinsics.c (atomic_ref_scm, atomic_set_scm): (atomic_swap_scm, atomic_compare_and_swap_scm): New intrinsics, given that lightning doesn't know atomics. (scm_bootstrap_intrinsics): Init new intrinsics. * libguile/vm-engine.c (atomic-scm-ref/immediate) (atomic-scm-set!/immediate, atomic-scm-swap!/immediate) (atomic-scm-compare-and-swap!/immediate): Use intrinsics, to be like the JIT.
2018-08-1364-bit intrinsic args and return values passed indirectly on 32-bitAndy Wingo3-10/+113
* libguile/intrinsics.h (INDIRECT_INT64_INTRINSICS): New definition. If true, int64 args and return values are passed by reference. Here to make JIT easier. * libguile/intrinsics.c (indirect_scm_to_int64, indirect_scm_to_uint64): (indirect_scm_to_uint64_truncate, indirect_scm_from_int64): (indirect_scm_from_uint64, indirect_lsh, indirect_rsh): New indirect variants. (scm_bootstrap_intrinsics): Use indirect variants as appropriate. * libguile/vm-engine.c: Update to call indirect intrinsics if appropriate.
2018-08-13Avoid needless 64-bit args on 32-bit machines for some intrinsicsAndy Wingo6-31/+26
* libguile/intrinsics.h: * libguile/intrinsics.c (string_set_x): Change to take size_t and u32 as args. (allocate_words): Change to take size_t as arg. * libguile/vm.c (expand_apply_argument): Rename from rest_arg_length, and also handle the stack manipulation. * libguile/vm-engine.c (expand-apply-argument): Update for intrinsic change. (call-scm-sz-u32): Rename from call-scm-u64-u64, as it matches its uses and will compile better on 32-bit systems. * module/system/vm/assembler.scm (define-scm-sz-u32-intrinsic): (string-set!): Update for new instrinsic call inst. * libguile/jit.c (compile_call_scm_sz_u32): Adapt.
2018-08-13Update error-wrong-num-args intrinsic prototypeAndy Wingo3-6/+15
* libguile/intrinsics.h (SCM_FOR_ALL_VM_INTRINSICS): * libguile/intrinsics.c (error_wrong_num_args): Take the thread as an arg, instead of the ostensible callee. * libguile/vm-engine.c: Update callers of wrong-num-args intrinsic to pass a thread instead.
2018-08-13Adapt JIT calling convention; continuations take mra from stackAndy Wingo5-26/+17
* libguile/intrinsics.h (SCM_FOR_ALL_VM_INTRINSICS): Update prototype of capture-continuation. * libguile/jit.h: * libguile/jit.c (scm_jit_enter_mcode): Return void, not the vra. Instead, we expect the code to set vp->ip for the vra. * libguile/vm-engine.c (instrument-entry, instrument-loop) (return-values, abort): Adapt scm_jit_enter_mcode calling convention. (capture-continuation): No need to pass an mra; the intrinsic will read it from the stack. * libguile/vm.c (capture_continuation): Remove mra arg, as we take mra from the continuation. (scm_call_n): Adapt to scm_jit_enter_mcode change.
2018-08-12Continuations capture machine code addressAndy Wingo15-92/+149
* libguile/continuations.c (scm_i_continuation_to_frame): Adapt to vra field renaming. (scm_i_reinstate_continuation, grow_stack, copy_stack_and_call) (scm_dynthrow): Take mra of continuation. Set on the vp before the longjmp. * libguile/continuations.h: Update scm_i_reinstate_continuation prototype. * libguile/dynstack.h: * libguile/control.c (scm_suspendable_continuation_p): * libguile/dynstack.c (PROMPT_WORDS, PROMPT_VRA, PROMPT_MRA): (PROMPT_JMPBUF, scm_dynstack_push_prompt, scm_dynstack_find_prompt) (scm_dynstack_wind_prompt): Store both virtual and machine return addresses on the dynstack, for prompts. * libguile/eval.c (eval): Pass NULL for mra. * libguile/intrinsics.c (push_prompt): Add mra arg, and pass it to the dynstack. * libguile/intrinsics.h: Update prototypes so that continuation-related intrinsics can save and restore the MRA. * libguile/jit.h: * libguile/jit.c: Return VRA when JIT code needs to tier down. * libguile/stacks.c (find_prompt, scm_make_stack) * libguile/throw.c (catch): Adapt find-prompt calls. * libguile/vm-engine.c (instrument-entry, instrument-loop): Add logic to continue with vcode after the mcode finishes. (compose-continuation, capture-continuation, abort, prompt): Add logic to pass NULL as captured MRA, but continue with mcode from new continuations, if appropriate. * libguile/vm.c (scm_i_vm_cont_to_frame, capture_stack) (scm_i_capture_current_stack, reinstate_continuation_x) (capture_continuation, compose_continuation_inner, compose_continuation) (capture_delimited_continuation, abort_to_prompt): Adapt to plumb around machine code continuations. (scm_call_n): Check "mra_after_abort" field for machine code continuation, if any. * libguile/vm.h (struct scm_vm): Add "mra_after_abort" field. (struct scm_vm_cont): Rename "ra" field to "vra" and add "mra" field.
2018-08-11Rework foreign-call trampolineAndy Wingo5-12/+24
* libguile/foreign.c (scm_i_foreign_call): Rename back from foreign_call. Need a new trampoline that's easier to call from JIT, until we actually rewrite the FFI in terms of the JIT. (scm_register_foreign): Remove foreign_call intrinsic init. * libguile/intrinsics.h (SCM_FOR_ALL_VM_INTRINSICS): Foreign-call intrinsic sets return directly on stack. * libguile/vm-engine.c (foreign-call): Adapt to new intrinsic behavior. * libguile/vm.c (foreign_call, scm_bootstrap_vm): Add new intrinsic wrapper.
2018-08-11Invoke VM hooks through intrinsicsAndy Wingo3-15/+23
* libguile/intrinsics.h (SCM_FOR_ALL_VM_INTRINSICS): Make intrinsics for the VM hooks. * libguile/vm-engine.c (RUN_HOOK): Run hooks through the intrinsics table. * libguile/vm.c (invoke_apply_hook, invoke_return_hook): (invoke_next_hook, invoke_abort_hook): Rename, remove NOINLINE attribute (as we call them through the intrinsics table). (scm_bootstrap_vm): Init new intrinsics.
2018-08-11Add unpack-values-object intrinsicAndy Wingo3-6/+15
* libguile/intrinsics.h (SCM_FOR_ALL_VM_INTRINSICS): Add unpack-values-object. * libguile/vm-engine.c (subr-call): If the object is a values object, call out to unpack-values-object. This is to avoid reifying allocate-frame code in each jitted subr. * libguile/vm.c (unpack_values_object, scm_bootstrap_vm): Define new intrinsic.
2018-08-08Change call/cc inst to capture-continuationAndy Wingo3-20/+15
* libguile/jit.c (compile_capture_continuation): Rename from call_cc now that the call is elsewhere. * libguile/vm-engine.c (call, tail-call): Remove needless SYNC_IP before get-callee-vcode; the intrinsic can sync the ip if needed from the frame. (capture-continuation): Rename from call/cc, and leave the call itself to tail-call. * libguile/vm.c (vm_builtin_call_with_current_continuation_code): Update to put the continuation in a local and then tail call. (get_callee_vcode): Sync vp->ip if we error.
2018-08-08Rework program->ip mapping in VM to always call intrinsicAndy Wingo3-42/+19
* libguile/intrinsics.h: * libguile/vm.c (get_callee_vcode): Rename from apply_non_program, and instead return the IP for the callee of a frame. (scm_call_n, scm_bootstrap_vm): Adapt to get_callee_vcode change. * libguile/vm-engine.c (call, tail-call, call/cc): Use get_callee_vcode unconditionally. JIT will do this to avoid so much code generation for calls.
2018-08-08Minor optimization in RESET_FRAMEAndy Wingo1-3/+9
* libguile/vm-engine.c (RESET_FRAME): Remove update of sp_min_since_gc.
2018-08-07Add missing include to adapt to recent merge from masterAndy Wingo1-0/+1
* libguile/r6rs-ports.c: Add syscalls.h include for scm_from_off_t.
2018-08-07Merge branch 'master' into lightningAndy Wingo58-468/+1549
This includes a manual cherry-pick of relevant stable-2.2 commits up to 4c91de3e45e7c98d5b7c484509fe5c59bd70f9fd.
2018-08-07Fix R6RS call-with-{input,output}-file to open textual ports.Mark H Weaver1-3/+3
Fixes <https://bugs.gnu.org/32329>. Reported and diagnosed by Göran Weinholt <goran@weinholt.se>. * module/rnrs/io/simple.scm (call-with-input-file) (call-with-output-file): Use 'open-{input,output}-file' to open the port in textual mode. Previously 'open-file-{input,output}-port' was used, which opened the port in binary mode.
2018-08-07srfi-19: Remove unused procedure.Ludovic Courtès1-19/+1
* module/srfi/srfi-19.scm (date->broken-down-time): Remove.
2018-08-07Add -Wshadowed-toplevel.Ludovic Courtès6-5/+130
* module/language/tree-il/analyze.scm (shadowed-toplevel-analysis): New variable. * module/language/tree-il/compile-cps.scm (%warning-passes): Add it. * module/system/base/message.scm (%warning-types): Add it. * test-suite/tests/tree-il.test ("warnings")["shadowed-toplevel"]: New test prefix. * module/ice-9/boot-9.scm (%auto-compilation-options): Add it. * doc/ref/api-evaluation.texi (Compilation): Add 'shadowed-toplevel' and 'macro-use-before-definition'.
2018-08-07r6rs-ports: 'put-bytevector' accepts 64-bit integers.Ludovic Courtès1-3/+3
* libguile/r6rs-ports.c (scm_put_bytevector): Use 'size_t' for c_start, c_count, and c_len.
2018-08-07compile: Update copyright year.Ludovic Courtès1-1/+1
* module/scripts/compile.scm (show-version): Update copyright year.
2018-08-07compile: Improve error message.Ludovic Courtès1-1/+1
* module/scripts/compile.scm (parse-args): Add missing newline in "unrecognized option" message.
2018-08-07compile: Add '-x' flag.Ludovic Courtès2-0/+11
* module/scripts/compile.scm (%options, compile): Add '-x'. * doc/ref/api-evaluation.texi (Compilation): Document it.
2018-08-07r6rs-ports: Accept 'port-position' values greater than 2^32.Ludovic Courtès2-2/+12
Reported by Ricardo Wurmus <rekado@elephly.net>. Fixes <https://bugs.gnu.org/32161>. * libguile/r6rs-ports.c (custom_binary_port_seek): Use 'scm_to_off_t' instead of 'scm_to_int'. * test-suite/tests/r6rs-ports.test ("8.2.7 Input Ports")["custom binary input port position, long offset"]: New test.
2018-08-07Make srfi-71 visible through 'cond-expand'.Mark H Weaver1-0/+2
This is a followup to commit eb90831ce81bcb85ae96d27011ebe71955cdf75d. * module/srfi/srfi-71.scm: Add missing 'cond-expand-provide'.
2018-08-07Update release docs.Ludovic Courtès1-8/+6
* doc/release.org: Update web site instructions.
2018-08-07build: Really build srfi/srfi-71.scm.Ludovic Courtès2-53/+1
Commit eb90831ce81bcb85ae96d27011ebe71955cdf75d added it to the wrong makefile. * module/Makefile.am (SOURCES): Add srfi/srfi-71.scm. * module/srfi/Makefile.am: Remove. It's a leftover from the 2009 build system rework in commit 3bb299b3f0d5b31957a6447d095ed723268019be.
2018-08-07Update NEWS.Ludovic Courtès1-0/+57
* NEWS: Update.
2018-08-07Update copyright years in '--version' and the manual.Ludovic Courtès2-3/+4
* module/ice-9/command-line.scm (version-etc): Change #:copyright-year to 2018. * doc/ref/guile.texi: Add 2017 and 2018 to the copyright years. * configure.ac (GUILE_CONFIGURE_COPYRIGHT): Add 2018.
2018-08-07Serialize accesses to submodule hash tables.Ludovic Courtès1-26/+32
Fixes <https://bugs.gnu.org/30602>. Previously, when compiling files in parallel like Guix does, threads would be concurrently inserting, rehashing, and reading the submodule hash table of module (). Thus, some threads would sometimes see an inconsistent state, leading to errors such as: Module named (system repl debug) does not exist * module/ice-9/boot-9.scm (call-with-module-autoload-lock): Move higher in the file. (module-name): Use it around call to 'nested-define-module!'. (resolve-module): Wrap the whole thing in 'call-with-module-autoload-lock'.