emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

scratch/igc c0b51c564c4 2/2: Fix hypothetical big-endian 32-bit WIDE_EMA


From: Pip Cet
Subject: scratch/igc c0b51c564c4 2/2: Fix hypothetical big-endian 32-bit WIDE_EMACS_INT + MPS build
Date: Wed, 11 Dec 2024 09:03:13 -0500 (EST)

branch: scratch/igc
commit c0b51c564c497576a64ac7e44c363d09ba2dbef1
Author: Pip Cet <pipcet@protonmail.com>
Commit: Pip Cet <pipcet@protonmail.com>

    Fix hypothetical big-endian 32-bit WIDE_EMACS_INT + MPS build
    
    * src/igc.c (fix_weak_hash_table_weak_part): Ensure we fix the LSB
    word of a 64-bit EMACS_UINT representing a 32-bit pointer.
    (weak_hash_table_entry):
    (make_weak_hash_table_entry):
    * src/lisp.h: Use EMACS_UINT, not intptr_t.
---
 src/igc.c  | 14 ++++++++++----
 src/lisp.h |  2 +-
 2 files changed, 11 insertions(+), 5 deletions(-)

diff --git a/src/igc.c b/src/igc.c
index d895d7c4d5f..b1ef6939b5f 100644
--- a/src/igc.c
+++ b/src/igc.c
@@ -2222,8 +2222,14 @@ fix_weak_hash_table_weak_part (mps_ss_t ss, struct 
Lisp_Weak_Hash_Table_Weak_Par
 
        for (ssize_t i = 0; i < limit; i++)
          {
-           bool was_nil = w->entries[i].intptr == 0;
-           IGC_FIX12_BASE (ss, &w->entries[i].intptr);
+           if (w->entries[i].intptr & 1)
+             eassert ((mps_word_t)w->entries[i].intptr ^ w->entries[i].intptr 
== 0);
+           bool was_nil = (w->entries[i].intptr) == 0;
+           intptr_t off = 0;
+#ifdef WORDS_BIGENDIAN
+           off = sizeof (w->entries[i].intptr) - sizeof (mps_word_t);
+#endif
+           IGC_FIX12_BASE (ss, ((char *)&w->entries[i].intptr) + off);
            bool is_now_nil = w->entries[i].intptr == 0;
 
            if (is_now_nil && !was_nil)
@@ -4093,7 +4099,7 @@ weak_hash_table_entry (struct Lisp_Weak_Hash_Table_Entry 
entry)
     }
   else
     {
-      intptr_t real_ptr = entry.intptr ^ alignment;
+      EMACS_UINT real_ptr = entry.intptr ^ alignment;
       client = (mps_addr_t)real_ptr;
     }
 
@@ -4125,7 +4131,7 @@ make_weak_hash_table_entry (Lisp_Object obj)
   else
     client = XUNTAG (obj, XTYPE (obj), void);
 
-  entry.intptr = (intptr_t)client;
+  entry.intptr = (EMACS_UINT)(uintptr_t)client;
 
   return entry;
 }
diff --git a/src/lisp.h b/src/lisp.h
index 2e349d37f48..c469793467c 100644
--- a/src/lisp.h
+++ b/src/lisp.h
@@ -2669,7 +2669,7 @@ typedef int32_t hash_idx_t;
 /* The reason for this unusual structure is an MPS peculiarity on 32-bit x86 
systems. */
 struct Lisp_Weak_Hash_Table_Entry
 {
-  intptr_t intptr; /* must be an MPS base pointer */
+  EMACS_UINT intptr; /* must be an MPS base pointer */
   Lisp_Object fixnum; /* a fixnum indicating the tag, or just a fixnum */
 };
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]