From: Paul Eggert Date: Sun, 11 Jul 2021 07:27:43 +0000 (-0700) Subject: Fix pdumper-related GC bug X-Git-Tag: emacs-28.0.90~1907 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=2f7afef5ffe023a7a12520201ab70643f826abfd;p=emacs.git 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. --- diff --git a/src/alloc.c b/src/alloc.c index 76d8c7ddd11..752eaec1352 100644 --- a/src/alloc.c +++ b/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. */