From 87062f0c05a46a146d1bd63c631da83ac0a64463 Mon Sep 17 00:00:00 2001 From: Pip Cet Date: Thu, 4 Jul 2024 18:17:43 +0000 Subject: [PATCH 2/5] Allow IGC headers to be pointers to an external extended real header --- src/igc.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/igc.c b/src/igc.c index b24ff19a137..9be30fcb3cf 100644 --- a/src/igc.c +++ b/src/igc.c @@ -480,21 +480,36 @@ #define IGC_HEADER_HASH(h) (((h)->v >> (IGC_HEADER_TYPE_BITS + IGC_HEADER_TAG_BI #define IGC_HEADER_TYPE(h) (((h)->v >> IGC_HEADER_TAG_BITS) & IGC_HEADER_TYPE_MASK) #define IGC_HEADER_TAG(h) ((h)->v & IGC_HEADER_TAG_MASK) +struct igc_exthdr +{ + EMACS_UINT nwords; + EMACS_UINT hash; + enum igc_obj_type obj_type; + Lisp_Object extra_dependency; +}; + +#define IGC_HEADER_EXTHDR(h) ((struct igc_exthdr *)(intptr_t)((h)->v & ~IGC_HEADER_TAG_MASK)) + enum igc_tag { IGC_TAG_NULL = 0, /* entire value must be 0 to avoid MPS issues */ IGC_TAG_OBJ = 1, /* IGC object */ + IGC_TAG_EXTHDR = 2, /* pointer to aligned external header */ }; static enum igc_obj_type igc_header_type (struct igc_header *h) { + if (IGC_HEADER_TAG (h) == IGC_TAG_EXTHDR) + return IGC_HEADER_EXTHDR (h)->obj_type; return IGC_HEADER_TYPE (h); } static unsigned igc_header_hash (struct igc_header *h) { + if (IGC_HEADER_TAG (h) == IGC_TAG_EXTHDR) + return IGC_HEADER_EXTHDR (h)->hash; return IGC_HEADER_HASH (h); } @@ -522,6 +537,8 @@ to_bytes (mps_word_t nwords) static size_t igc_header_nwords (const struct igc_header *h) { + if (IGC_HEADER_TAG (h) == IGC_TAG_EXTHDR) + return IGC_HEADER_EXTHDR (h)->nwords; return IGC_HEADER_NWORDS (h); } -- 2.45.2