marked. */
static void
-mark_maybe_pointer (void *p)
+mark_maybe_pointer (void *p, bool symbol_only)
{
struct mem_node *m;
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);
+ void *po = (void *) ((uintptr_t) p & mask);
+ char *cp = p;
+ char *cpo = po;
/* 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. */
- int type = pdumper_find_object_type (p);
- if (pdumper_valid_object_type_p (type))
- mark_object (type == Lisp_Symbol
- ? make_lisp_symbol (p)
- : make_lisp_ptr (p, type));
+ int type = pdumper_find_object_type (po);
+ if (pdumper_valid_object_type_p (type)
+ && (!USE_LSB_TAG || p == po || cp - cpo == type))
+ {
+ if (type == Lisp_Symbol)
+ mark_object (make_lisp_symbol (po));
+ else if (!symbol_only)
+ mark_object (make_lisp_ptr (po, type));
+ }
return;
}
case MEM_TYPE_CONS:
{
+ if (symbol_only)
+ return;
struct Lisp_Cons *h = live_cons_holding (m, p);
if (!h)
return;
case MEM_TYPE_STRING:
{
+ if (symbol_only)
+ return;
struct Lisp_String *h = live_string_holding (m, p);
if (!h)
return;
case MEM_TYPE_FLOAT:
{
+ if (symbol_only)
+ return;
struct Lisp_Float *h = live_float_holding (m, p);
if (!h)
return;
case MEM_TYPE_VECTORLIKE:
{
+ if (symbol_only)
+ return;
struct Lisp_Vector *h = live_large_vector_holding (m, p);
if (!h)
return;
case MEM_TYPE_VECTOR_BLOCK:
{
+ if (symbol_only)
+ return;
struct Lisp_Vector *h = live_small_vector_holding (m, p);
if (!h)
return;
for (pp = start; (void const *) pp < end; pp += GC_POINTER_ALIGNMENT)
{
void *p = *(void *const *) pp;
- mark_maybe_pointer (p);
+ mark_maybe_pointer (p, false);
/* Unmask any struct Lisp_Symbol pointer that make_lisp_symbol
previously disguised by adding the address of 'lispsym'.
non-adjacent words and P might be the low-order word's value. */
intptr_t ip;
INT_ADD_WRAPV ((intptr_t) p, (intptr_t) lispsym, &ip);
- mark_maybe_pointer ((void *) ip);
+ mark_maybe_pointer ((void *) ip, true);
}
}