mirror of
git://git.sv.gnu.org/emacs.git
synced 2026-01-07 20:30:32 -08:00
Fix pdumper-related GC bug
* src/alloc.c (mark_maybe_pointer): Also mark pointers to pdumper objects, even when the pointers are tagged. Add a FIXME saying why this isn’t enough.
This commit is contained in:
parent
d93ff9459f
commit
2f7afef5ff
1 changed files with 11 additions and 0 deletions
11
src/alloc.c
11
src/alloc.c
|
|
@ -4755,6 +4755,17 @@ mark_maybe_pointer (void *p)
|
|||
definitely _don't_ have an object. */
|
||||
if (pdumper_object_p (p))
|
||||
{
|
||||
/* FIXME: This code assumes that every reachable pdumper object
|
||||
is addressed either by a pointer to the object start, or by
|
||||
the same pointer with an LSB-style tag. This assumption
|
||||
fails if a pdumper object is reachable only via machine
|
||||
addresses of non-initial object components. Although such
|
||||
addressing is rare in machine code generated by C compilers
|
||||
from Emacs source code, it can occur in some cases. To fix
|
||||
this problem, the pdumper code should grok non-initial
|
||||
addresses, as the non-pdumper code does. */
|
||||
uintptr_t mask = VALMASK;
|
||||
p = (void *) ((uintptr_t) p & mask);
|
||||
/* Don't use pdumper_object_p_precise here! It doesn't check the
|
||||
tag bits. OBJ here might be complete garbage, so we need to
|
||||
verify both the pointer and the tag. */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue