[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 */
};