Age | Commit message (Collapse) | Author | Files | Lines |
|
* libguile/jit.c (compile_alloc_frame): Fix alloc-frame filling in of
undefined values for when previous frame size was unknown.
|
|
* libguile/jit.c (compile_return_values, compile_subr_call): Clear frame
size.
|
|
* libguile/lightning/lib/jit_x86.c (_rvs): Mark R12 as callee-save.
|
|
* libguile/jit.c (emit_run_hook): Use sign-extending load, as unsigned
load doesn't exist on 32-bit targets.
|
|
* 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.
|
|
* libguile/jit.c (emit_get_ip_relative_addr): Fix load width.
|
|
* 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>.
|
|
* libguile/jit.c (compile_subr_call): Optimizations.
|
|
* libguile/jit.c: Add some overview comments.
|
|
|
|
* 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.
|
|
* 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.
|
|
* 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.
|
|
* 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.
|
|
* 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.
|
|
* module/system/vm/assembler.scm (link-data): Fix relocation addend for
JIT data bounds. I never get this right!
|
|
* 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.
|
|
* 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.
|
|
* libguile/jit.c: Implement most of a JIT. Untested and still needs to
be wired up.
|
|
* libguile/vm-builtins.h:
* libguile/vm.c (scm_vm_builtin_ref): Expose internally.
|
|
* libguile/gsubr.h:
* libguile/gsubr.c (scm_subr_function_by_index): New internal function.
(scm_subr_function): Use new function.
|
|
* 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.
|
|
* 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.
|
|
* 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.
|
|
* 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.
|
|
* 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.
|
|
* 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.
|
|
* 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.
|
|
* 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.
|
|
* 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.
|
|
* 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.
|
|
* 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.
|
|
* 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.
|
|
* libguile/vm-engine.c (RESET_FRAME): Remove update of sp_min_since_gc.
|
|
* libguile/r6rs-ports.c: Add syscalls.h include for scm_from_off_t.
|
|
This includes a manual cherry-pick of relevant stable-2.2 commits up to
4c91de3e45e7c98d5b7c484509fe5c59bd70f9fd.
|
|
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.
|
|
* module/srfi/srfi-19.scm (date->broken-down-time): Remove.
|
|
* 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'.
|
|
* libguile/r6rs-ports.c (scm_put_bytevector): Use 'size_t' for c_start,
c_count, and c_len.
|
|
* module/scripts/compile.scm (show-version): Update copyright year.
|
|
* module/scripts/compile.scm (parse-args): Add missing newline in
"unrecognized option" message.
|
|
* module/scripts/compile.scm (%options, compile): Add '-x'.
* doc/ref/api-evaluation.texi (Compilation): Document it.
|
|
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.
|
|
This is a followup to commit eb90831ce81bcb85ae96d27011ebe71955cdf75d.
* module/srfi/srfi-71.scm: Add missing 'cond-expand-provide'.
|
|
* doc/release.org: Update web site instructions.
|
|
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.
|
|
* NEWS: Update.
|
|
* 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.
|
|
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'.
|