1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2026-03-07 14:31:41 -08:00
Commit graph

1364 commits

Author SHA1 Message Date
Andrea Corallo
cd4ef52c86 Merge remote-tracking branch 'savannah/master' into HEAD 2020-05-17 22:49:02 +01:00
Andrea Corallo
abec255c02 * Fix Garbage Collector for missing calle-saved regs content (Bug#41357)
* src/alloc.c (SET_STACK_TOP_ADDRESS): Do not call
	__builtin_unwind_init.
	(flush_stack_call_func1): Rename from 'flush_stack_call_func'.
	(flush_stack_call_func): New function to spill all registers
	before calling 'flush_stack_call_func1'.  This to make sure the
	top of the stack identified includes those registers.
2020-05-17 22:37:28 +01:00
Andrea Corallo
d73e64076e Store function documentations in a hash table.
* src/pdumper.c (dump_subr): Update Lisp_Subr hash.
	(dump_subr): Update for new compilation unit layout.
	(dump_vectorlike): Update pvec_type hash.

	* src/lisp.h (struct Lisp_Subr): Remove 'native_doc' index.
	(DEFUN): Update macro for new compilation unit
	layout.

	* src/doc.c (Fdocumentation): Update for new compilation unit
	layout.

	* src/comp.h (struct Lisp_Native_Comp_Unit):
	Add 'data_fdoc_h' field.

	* src/comp.c (TEXT_FDOC_SYM): New macro.
	(emit_ctxt_code): Emit function documentations.
	(load_comp_unit): Load function documentation.
	(Fcomp__register_subr): Rename parameter.
	(Fcomp__register_subr): Update for new compilation unit
	layout.

	* src/alloc.c (mark_object): Update for new compilation unit
	layout.
	(syms_of_alloc): Likewise.

	* lisp/emacs-lisp/comp.el (comp-ctxt): Add doc-index-h slot.
	(comp-emit-for-top-level): Emit doc index as 'comp--register-subr'
	doc parameter.
2020-04-25 19:55:39 +01:00
Andrea Corallo
3cc0438629 Merge remote-tracking branch 'savannah/master' into HEAD 2020-04-03 11:15:55 +01:00
Stefan Monnier
cddf85d256 Remove all_buffers and the associated next field of buffers
* src/alloc.c (enum mem_type): Remove MEM_TYPE_BUFFER.
(allocate_buffer): Allocate like any other pseudovector.
Don't register on `all_buffers` any more.
(live_buffer_holding, live_buffer_p): Delete functions.
(mark_maybe_object, valid_lisp_object_p): Don't pay attention to
MEM_TYPE_BUFFER any more.
(garbage_collect): Only compact the live buffers.
(mark_buffer): Mark the undo_list of dead buffers here.
(mark_object): Buffers are normal pseudovectors now.
(sweep_buffers): Don't do the actual sweep here, just cleanup the
markers and only for live buffers.

* src/buffer.c (all_buffers): Remove variable.
(Fkill_buffer): Don't check indirect dead buffers.
Set the undo_list before we remove ourselves from the list of live buffers.
(Fbuffer_swap_text, Fset_buffer_multibyte): Don't check indirect dead
buffers.
(init_buffer_once): Don't set `all_buffers`.
(init_buffer): Don't map new memory for dead buffers.

* src/buffer.h (struct buffer): Remove `next` field.
(FOR_EACH_BUFFER): Remove macro.

* src/pdumper.c (dump_buffer): Don't dump the `next` field.
2020-03-31 19:45:45 -04:00
Andrea Corallo
e57d5a71ba Merge remote-tracking branch 'savannah/master' into HEAD 2020-03-16 23:08:47 +00:00
Eli Zaretskii
ff862f55f4 Reverse the meaning of 2nd arg to 'live_buffer_holding'
* src/alloc.c (live_buffer_holding): Rename ALL_BUFFERS ti
IGNORE_KILLED, and reverse the condition for returning killed
buffers.
(live_buffer_p): Add commentary.
(live_buffer_p, mark_maybe_object, mark_maybe_pointer): Reverse
the 2nd argument to live_buffer_holding.  (Bug#39962)
2020-03-15 16:47:54 +02:00
Pip Cet
afaf2f4651 Make sure we mark reachable killed buffers during GC
* src/alloc.c (live_buffer_holding): Add ALL_BUFFERS argument for
returning killed buffers.
(mark_maybe_object, mark_maybe_pointer): Use the additional
argument.  (Bug#39962)
2020-03-15 16:35:07 +02:00
Andrea Corallo
2cf4b81009 * Fix GC mark for native compiled functions
native_intspec and native_doc fields has to be reached by the subr
cause are not anymore in the CU.
2020-03-10 10:42:56 +00:00
Andrea Corallo
62384df265 * Reduce stack depth while marking native compiled subrs 2020-03-01 19:22:27 +00:00
Andrea Corallo
15aedf3e3d Merge remote-tracking branch 'savannah/master' into HEAD 2020-02-04 15:11:20 +01:00
Andrea Corallo
7c93bb113e Rework load mechanism to make Vcomp_loaded_handles unnecessary 2020-02-03 21:56:46 +00:00
AndreaCorallo
6696b561d4 Fix load_comp_unit for non zero speeds
'dlopen' returns the same handle when trying to load two times
the same shared.

Touching 'd_reloc' etc leads to fails in case a frame with a reference
to it in a register is active. (comp-speed >= 0)
2020-02-03 12:58:09 +01:00
Paul Eggert
6f580542c1 Fix crash when sending Gnus message (Bug#39207)
* src/alloc.c (resize_string_data): The string must be multibyte.
When not bothering to reallocate, do bother to change the byte count.
* test/src/alloc-tests.el (aset-nbytes-change) New test.
2020-01-22 23:44:34 -08:00
Paul Eggert
b222e1aaf9 Don’t assume sizeof (size_t) == 4 in allocators
This removes some old 32-bit assumptions in Emacs allocator tuning,
and improves performance of ‘make compile-always’ by about 7% on a
couple of 64-bit GNU/Linux platforms I tried it on.  It should not
affect performance on 32-bit platforms.
* src/alloc.c (MALLOC_SIZE_NEAR): New macro.
(MALLOC_ALIGNMENT): New constant.
(INTERVAL_BLOCK_SIZE, SBLOCK_SIZE, STRING_BLOCK_SIZE): Use the new
macro.  Make these enum constants since they need not be macros.
2020-01-18 13:21:20 -08:00
Paul Eggert
c1b6d5c5b9 Improve performance when a string's byte count changes
* src/alloc.c (allocate_string_data): Now static.
Remove code for when Faset calls this function when S
already has data assigned, as that can no longer happen.
(resize_string_data): New function, which avoids relocation in
more cases than the old code did, by not bothering to relocate
when the size changes falls within the alignment slop.
* src/data.c (Faset): Use resize_string_data.
Change a while to a do-while since it must iterate at least once.
2020-01-18 00:02:12 -08:00
Paul Eggert
add2b2da72 Fix bug in recent allocate_string_data patch
Reported by Glenn Morris in:
https://lists.gnu.org/r/emacs-devel/2020-01/msg00098.html
* src/alloc.c (allocate_string_data): If the string is small and
there is not enough room in the current block, clear the string if
CLEARIT.
2020-01-04 13:34:06 -08:00
Paul Eggert
cadf985cb6 Let the OS clear new large strings of NUL
On my platform, this sped up (make-string 4000000000 0) from 2.5
to 0.015 seconds (not that people should want to do this much :-).
* src/alloc.c (allocate_string_data): New arg CLEARIT.
Callers changed.
(Fmake_string): Prefer calloc to malloc+memset when allocating a
large string of NUL bytes.
(make_clear_string): New function.
(make_uninit_string): Use it.
(make_clear_multibyte_string): New function.
(make_uninit_multibyte_string): Use it.
2020-01-03 17:15:44 -08:00
Glenn Morris
98ab70bc51 * src/alloc.c (cleanup_vector): Fix --without-modules builds. 2020-01-03 14:26:02 -08:00
Philipp Stephani
48ffef5ef4 Implement finalizers for module functions (Bug#30373)
* src/module-env-28.h: Add new module environment functions to
module environment for Emacs 28.

* src/emacs-module.h.in: Document that 'emacs_finalizer' also works
for function finalizers.

* src/emacs-module.c (CHECK_MODULE_FUNCTION): New function.
(struct Lisp_Module_Function): Add finalizer data member.
(module_make_function): Initialize finalizer.
(module_get_function_finalizer)
(module_set_function_finalizer): New module environment functions.
(module_finalize_function): New function.
(initialize_environment): Initialize new environment functions.

* src/alloc.c (cleanup_vector): Call potential module function
finalizer during garbage collection.

* test/data/emacs-module/mod-test.c (signal_error): New helper
function.
(memory_full): Use it.
(finalizer): New example function finalizer.
(Fmod_test_make_function_with_finalizer)
(Fmod_test_function_finalizer_calls): New test module functions.
(emacs_module_init): Define them.

* test/src/emacs-module-tests.el (module/function-finalizer): New unit
test.

* doc/lispref/internals.texi (Module Functions): Document new
functionality.
(Module Misc): Move description of 'emacs_finalizer' type to 'Module
Functions' node, and add a reference to it.

* etc/NEWS: Mention new functionality.
2020-01-03 19:24:10 +01:00
Paul Eggert
dd0e4d4e16 Let the OS clear large new objects
Prefer calloc to malloc+memset when allocating large zeroed objects.
This avoids page thrashing when (make-vector 1000000000 nil)
allocates a large nil vector, as Emacs need not touch the
vector’s pages.  This wins on platforms like GNU/Linux where
calloc can fiddle with page tables to create a block of memory
that is lazily zeroed.
* src/alloc.c (lisp_malloc, lmalloc, allocate_vectorlike):
New arg CLEARIT to tell callee whether to use malloc or calloc.
All callers changed.
(allocate_clear_vector, allocate_nil_vector): New functions.
* src/alloc.c (xzalloc, make_vector):
* src/lisp.h (make_nil_vector):
Prefer calloc to malloc + memset(...,0,...).
2020-01-02 18:11:25 -08:00
Andrea Corallo
fdb31d6a27 fix naming for predicate SUBR_NATIVE_COMPILEDP 2020-01-01 11:38:17 +01:00
Andrea Corallo
ef59b67e46 mitigate ifdef proliferation 2020-01-01 11:38:16 +01:00
Andrea Corallo
a88e5f0f19 better compilation unit definition 2020-01-01 11:38:14 +01:00
Andrea Corallo
4c8b46514d some rename on compilation unit struct 2020-01-01 11:38:14 +01:00
Andrea Corallo
c5bb62f99d initial gc support 2020-01-01 11:38:14 +01:00
Andrea Corallo
9a8f33f285 introduce SUBRP_NATIVE_COMPILEDP 2020-01-01 11:38:14 +01:00
Andrea Corallo
4496a3f5ba initial compilation unit as object add 2020-01-01 11:38:13 +01:00
Andrea Corallo
a248dfe2c3 native compile interactive functions support 2020-01-01 11:38:12 +01:00
Andrea Corallo
f4de790bee add native compiled function docstring support 2020-01-01 11:38:11 +01:00
Paul Eggert
365e01cc9f Update copyright year to 2020
Run "TZ=UTC0 admin/update-copyright $(git ls-files)".
2020-01-01 00:59:52 +00:00
Eli Zaretskii
a01a722282 Update documentation of pure-space overflow
* doc/lispref/internals.texi (Garbage Collection)
(Pure Storage):
* src/alloc.c (Fgarbage_collect): Update the documentation of
pure-space overflow for when pdumper is used.  (Bug#38492)
2019-12-14 20:02:11 +02:00
Paul Eggert
52172d2340 Fix gc-elapsed rounding bug
* src/alloc.c (garbage_collect): Don’t accumulate rounding
errors when computing gc-elapsed.
2019-09-14 10:56:12 -07:00
Paul Eggert
bac66302e9 Improve gc-cons-percentage calculation
The old calculation relied on a hodgpodge of partly updated GC
stats to find a number to multiply gc-cons-percentage by.
The new one counts data found by the previous GC, plus half of
the data allocated since then; this is more systematic albeit
still ad hoc.
* src/alloc.c (consing_until_gc, gc_threshold, consing_threshold):
Now EMACS_INT, not intmax_t.
(HI_THRESHOLD): New macro.
(tally_consing): New function.
(make_interval, allocate_string, allocate_string_data)
(make_float, free_cons, allocate_vectorlike, Fmake_symbol): Use it.
(allow_garbage_collection, inhibit_garbage_collection)
(consing_threshold, garbage_collect):
Use HI_THRESHOLD rather than INTMAX_MAX.
(consing_threshold): New arg SINCE_GC.  All callers changed.
(bump_consing_until_gc): Return new consing_until_gc, instead of
nil.  All callers changed.  Don’t worry about overflow since we
now saturate at HI_THRESHOLD.  Guess that half of
recently-allocated objects are still alive, instead of relying on
the previous (even less-accurate) hodgepodge.
(maybe_garbage_collect): New function.
(garbage_collect): Work even if a finalizer disables or enables
memory profiling.  Do not use malloc_probe if GC reclaimed nothing.
* src/lisp.h (maybe_gc): Call maybe_garbage_collect instead
of garbage_collect.
2019-09-14 00:37:26 -07:00
Paul Eggert
e4fb98b542 Simplify GC statistics-gathering
* src/alloc.c (make_interval, allocate_string, make_float)
(free_cons, Fcons, setup_on_free_list)
(allocate_vector_from_block, Fmake_symbol):
Do not update gcstat, since it is for statistics from the most
recent GC, not for a partially-updated hodgepodge.
(sweep_vectors): Update gcstat, since setup_on_free_list
no longer does.
(garbage_collect_1): Rename to garbage_collect and adopt its API.
Remove the old garbage_collect, which is no longer needed.
All callers changed.
2019-09-13 16:10:54 -07:00
Paul Eggert
5fafa40d07 Improve checking of pdump load failures
* src/alloc.c (memory_full): Just report "memory exhausted" if
failure occurs during initialization, since fancier recovery
schemes are not likely to work when not initialized.
* src/emacs.c (dump_error_to_string): Accept int, not enum
pdumper_load_result, since the result might not fit in the
enum.  Use strerror if it was derived from errno.  This is for
better diagnostics of pdump load failures.
(load_pdump_find_executable): Return char *, not enum.  2nd
arg is now pointer to buffer size, rather than pointer to
pointer to buffer.  All callers changed.  Use Emacs allocator
since they should now be OK even during early startup.
Use check_executable instead access, to use effective rather
than real permissions.
(load_pdump): Return void since callers ignore result.
Use int where enum could be too narrow.  Use heap rather
than stack for possibly-long string.  Prefer ptrdiff_t to
size_t.
* src/fileio.c (check_executable): Now extern.
* src/pdumper.c (pdumper_load): Return int that may have
errno added to it, for better diagnostics when loads fail.
2019-09-11 11:27:14 -07:00
Paul Eggert
b6b7c7fc98 Fix bug when gc-cons-percentage is bumped to 0.8
Problem reported by Michael Heerdegen (Bug#37321).
* src/alloc.c (gc_threshold): New static var.
(bump_consing_until_gc): Change args from DIFF to THRESHOLD and
PERCENTAGE.  All uses changed.  When accounting for a changed
gc-cons-percentage, do not assume that total_bytes_of_live_objects
returns the same value now that it did the last time we were
called.
2019-09-07 18:08:44 -07:00
Paul Eggert
16ab25f136 Fix bugs when recalculating consing_until_gc
Problem reported by Joseph Mingrone (Bug#37006#72).
* src/alloc.c (watch_gc_cons_threshold)
(watch_gc_cons_percentage):
Don’t try to store an intmax_t into an int.
Redo to make the code clearer.
(watch_gc_cons_percentage):
Use gc_cons_threshold, not consing_until_gc.
2019-09-05 13:27:07 -07:00
Paul Eggert
d20655669b Avoid casting -1 to possibly-unsigned enum
* src/alloc.c (mark_maybe_pointer):
* src/pdumper.h (pdumper_object_p_precise):
Use pdumper_valid_object_type_p.
* src/pdumper.c (pdumper_find_object_type_impl):
* src/pdumper.h (pdumper_find_object_type):
Return int, not enum Lisp_Type.  All callers changed.
* src/pdumper.h (PDUMPER_NO_OBJECT): Do not cast -1 to enum
Lisp_Type; in theory, C18 says this could yield 7, which would
mean PDUMPER_NO_OBJECT == Lisp_Float (!).
(pdumper_valid_object_type_p): New function.
2019-09-03 17:34:50 -07:00
Paul Eggert
97ffa339b6 Sync consing_until_gc with gc-cons-threshold
Add watchers for gc-cons-threshold and gc-cons-percentage
that update consing_until_gc accordingly.
Suggested by Eli Zaretskii (Bug#37006#52).
* src/alloc.c (consing_threshold, bump_consing_until_gc)
(watch_gc_cons_threshold, watch_gc_cons_percentage):
New functions.
(garbage_collect_1): Use consing_threshold.
(syms_of_alloc): Arrange to watch gc-cons-threshold and
gc-cons-percentage.
2019-09-03 13:03:47 -07:00
Paul Eggert
2b552f3489 Don’t debug fset by default
This GC bug seems to have been fixed, so the check is no longer
needed in production code.  From a suggestion by Pip Cet in:
https://lists.gnu.org/r/emacs-devel/2019-08/msg00316.html
* src/alloc.c (SUSPICIOUS_OBJECT_CHECKING) [!ENABLE_CHECKING]:
Do not define.
(find_suspicious_object_in_range, detect_suspicious_free):
Expand to proper dummy expressions if !SUSPICIOUS_OBJECT_CHECKING.
* src/data.c (Ffset): Convert test to an eassert.
2019-08-21 22:30:18 -07:00
Paul Eggert
39fee20994 Be more careful about pointers to bignum vals
This uses ‘const’ to be better at catching bugs that
mistakenly attempt to modify a bignum value.
Lisp bignums are supposed to be immutable.
* src/alloc.c (make_pure_bignum):
* src/fns.c (sxhash_bignum):
Accept Lisp_Object instead of struct Lisp_Bignum *, as that’s
simpler now.  Caller changed.
* src/bignum.h (bignum_val, xbignum_val): New inline functions.
Prefer them to &i->value and XBIGNUM (i)->value, since they
apply ‘const’ to the result.
* src/timefns.c (lisp_to_timespec): Use mpz_t const *
to point to a bignum value.
2019-08-21 00:11:45 -07:00
Paul Eggert
2098e8afaf Remove INT_ADD_WRAPV bug workarounds
* src/alloc.c (free_cons):
* src/casefiddle.c (do_casify_multibyte_string):
* src/editfns.c (styled_format):
* src/image.c (png_load_body):
Remove recent workarounds for INT_ADD_WRAPV bugs since
the bugs have been fixed (Bug#37006).
2019-08-14 18:24:33 -07:00
Paul Eggert
f4974d6fe6 Don’t increase consing_until_gc when out of memory
* src/alloc.c (memory_full): Don’t increase consing_until_gc.
Suggested by Eli Zaretskii (Bug#37006#46).
2019-08-13 12:29:13 -07:00
Paul Eggert
b80559be21 Let consing_until_gc exceed EMACS_INT_MAX
This builds on the previous patch.
* src/alloc.c (consing_until_gc): Now of type intmax_t,
since gc-cons-threshold can be up to INTMAX_MAX.  All uses changed.
* src/lisp.h (CONSING_CT_MAX, consing_ct): Remove.
2019-08-13 12:22:30 -07:00
Paul Eggert
a354736e1d Let consing_until_gc exceed INTPTR_MAX
Suggested by Eli Zaretskii (Bug#37006#46).
* src/alloc.c (consing_until_gc): Now of type consing_ct.
All uses changed, so gc-cons-threshold no longer saturates
against OBJECT_CT_MAX.
(object_ct): Move typedef here from lisp.h.
* src/lisp.h (consing_ct, CONSING_CT_MAX): New type and macro.
(OBJECT_CT_MAX): Remove.  Replace all uses with CONSING_CT_MAX.
2019-08-13 12:12:38 -07:00
Paul Eggert
8882761440 Fix GC threshold typo
Problem reported by Eli Zaretskii (Bug#37006#25).
* src/alloc.c (garbage_collect_1): Fix typo in threshold calc.
Go back to dividing by 10 since the numerator’s a constant now.
Problem introduced in 2019-07-21T02:40:03Z!eggert@cs.ucla.edu.
2019-08-13 10:04:01 -07:00
Eli Zaretskii
2b329ed420 ; Add commentary to recent changes
* src/image.c (png_load_body):
* src/editfns.c (styled_format):
* src/casefiddle.c (do_casify_multibyte_string):
* src/alloc.c (free_cons): Comment why we use a signed
temporary integer variable.  (Bug#37006)
2019-08-12 17:39:09 +03:00
Paul Eggert
57fc1a5f7c Prefer signed when testing for signed overflow
* src/alloc.c (free_cons):
* src/casefiddle.c (do_casify_multibyte_string):
* src/editfns.c (styled_format):
* src/image.c (png_load_body):
Use signed arguments to INT_MULTIPLY_WRAPV etc.  This doesn’t fix
any bugs, but GCC emits better code when all args are signed.
Also, this removes the need for an if in free_cons (Bug#37006).
2019-08-11 17:10:48 -07:00
Eli Zaretskii
94644d862c Fix garbage collection
* src/alloc.c (free_cons): Avoid false positives in
INT_ADD_WRAPV.  (Bug#37006)
2019-08-11 19:23:23 +03:00