aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/pdumper.c26
1 files changed, 10 insertions, 16 deletions
diff --git a/src/pdumper.c b/src/pdumper.c
index 339aed1f657..34998549cc8 100644
--- a/src/pdumper.c
+++ b/src/pdumper.c
@@ -103,7 +103,6 @@ verify (sizeof (intptr_t) == sizeof (ptrdiff_t));
103verify (sizeof (void (*) (void)) == sizeof (void *)); 103verify (sizeof (void (*) (void)) == sizeof (void *));
104verify (sizeof (ptrdiff_t) <= sizeof (Lisp_Object)); 104verify (sizeof (ptrdiff_t) <= sizeof (Lisp_Object));
105verify (sizeof (ptrdiff_t) <= sizeof (EMACS_INT)); 105verify (sizeof (ptrdiff_t) <= sizeof (EMACS_INT));
106verify (CHAR_BIT == 8);
107 106
108static size_t 107static size_t
109divide_round_up (size_t x, size_t y) 108divide_round_up (size_t x, size_t y)
@@ -133,6 +132,7 @@ static int nr_remembered_data = 0;
133typedef int_least32_t dump_off; 132typedef int_least32_t dump_off;
134#define DUMP_OFF_MIN INT_LEAST32_MIN 133#define DUMP_OFF_MIN INT_LEAST32_MIN
135#define DUMP_OFF_MAX INT_LEAST32_MAX 134#define DUMP_OFF_MAX INT_LEAST32_MAX
135#define DUMP_OFF_WIDTH INT_LEAST32_WIDTH
136#define PRIdDUMP_OFF PRIdLEAST32 136#define PRIdDUMP_OFF PRIdLEAST32
137 137
138enum { EMACS_INT_XDIGITS = (EMACS_INT_WIDTH + 3) / 4 }; 138enum { EMACS_INT_XDIGITS = (EMACS_INT_WIDTH + 3) / 4 };
@@ -222,8 +222,7 @@ enum emacs_reloc_type
222enum 222enum
223 { 223 {
224 EMACS_RELOC_TYPE_BITS = 3, 224 EMACS_RELOC_TYPE_BITS = 3,
225 EMACS_RELOC_LENGTH_BITS = (sizeof (dump_off) * CHAR_BIT 225 EMACS_RELOC_LENGTH_BITS = DUMP_OFF_WIDTH - EMACS_RELOC_TYPE_BITS
226 - EMACS_RELOC_TYPE_BITS)
227 }; 226 };
228 227
229struct emacs_reloc 228struct emacs_reloc
@@ -273,7 +272,7 @@ enum
273 dump. Always suitable for heap objects; may be more aligned. */ 272 dump. Always suitable for heap objects; may be more aligned. */
274 DUMP_ALIGNMENT = max (GCALIGNMENT, DUMP_RELOCATION_ALIGNMENT), 273 DUMP_ALIGNMENT = max (GCALIGNMENT, DUMP_RELOCATION_ALIGNMENT),
275 274
276 DUMP_RELOC_OFFSET_BITS = sizeof (dump_off) * CHAR_BIT - DUMP_RELOC_TYPE_BITS 275 DUMP_RELOC_OFFSET_BITS = DUMP_OFF_WIDTH - DUMP_RELOC_TYPE_BITS
277 }; 276 };
278 277
279verify (RELOC_DUMP_TO_EMACS_LV + 8 < (1 << DUMP_RELOC_TYPE_BITS)); 278verify (RELOC_DUMP_TO_EMACS_LV + 8 < (1 << DUMP_RELOC_TYPE_BITS));
@@ -4997,6 +4996,7 @@ dump_mmap_contiguous (struct dump_memory_map *maps, int nr_maps)
4997} 4996}
4998 4997
4999typedef uint_fast32_t dump_bitset_word; 4998typedef uint_fast32_t dump_bitset_word;
4999#define DUMP_BITSET_WORD_WIDTH UINT_FAST32_WIDTH
5000 5000
5001struct dump_bitset 5001struct dump_bitset
5002{ 5002{
@@ -5007,9 +5007,9 @@ struct dump_bitset
5007static bool 5007static bool
5008dump_bitsets_init (struct dump_bitset bitset[2], size_t number_bits) 5008dump_bitsets_init (struct dump_bitset bitset[2], size_t number_bits)
5009{ 5009{
5010 int xword_size = sizeof (bitset[0].bits[0]); 5010 int xword_size = sizeof (dump_bitset_word);
5011 int bits_per_word = xword_size * CHAR_BIT; 5011 ptrdiff_t words_needed = divide_round_up (number_bits,
5012 ptrdiff_t words_needed = divide_round_up (number_bits, bits_per_word); 5012 DUMP_BITSET_WORD_WIDTH);
5013 dump_bitset_word *bits = calloc (words_needed, 2 * xword_size); 5013 dump_bitset_word *bits = calloc (words_needed, 2 * xword_size);
5014 if (!bits) 5014 if (!bits)
5015 return false; 5015 return false;
@@ -5024,9 +5024,7 @@ static dump_bitset_word *
5024dump_bitset__bit_slot (const struct dump_bitset *bitset, 5024dump_bitset__bit_slot (const struct dump_bitset *bitset,
5025 size_t bit_number) 5025 size_t bit_number)
5026{ 5026{
5027 int xword_size = sizeof (bitset->bits[0]); 5027 ptrdiff_t word_number = bit_number / DUMP_BITSET_WORD_WIDTH;
5028 int bits_per_word = xword_size * CHAR_BIT;
5029 ptrdiff_t word_number = bit_number / bits_per_word;
5030 eassert (word_number < bitset->number_words); 5028 eassert (word_number < bitset->number_words);
5031 return &bitset->bits[word_number]; 5029 return &bitset->bits[word_number];
5032} 5030}
@@ -5035,10 +5033,8 @@ static bool
5035dump_bitset_bit_set_p (const struct dump_bitset *bitset, 5033dump_bitset_bit_set_p (const struct dump_bitset *bitset,
5036 size_t bit_number) 5034 size_t bit_number)
5037{ 5035{
5038 unsigned xword_size = sizeof (bitset->bits[0]);
5039 unsigned bits_per_word = xword_size * CHAR_BIT;
5040 dump_bitset_word bit = 1; 5036 dump_bitset_word bit = 1;
5041 bit <<= bit_number % bits_per_word; 5037 bit <<= bit_number % DUMP_BITSET_WORD_WIDTH;
5042 return *dump_bitset__bit_slot (bitset, bit_number) & bit; 5038 return *dump_bitset__bit_slot (bitset, bit_number) & bit;
5043} 5039}
5044 5040
@@ -5047,11 +5043,9 @@ dump_bitset__set_bit_value (struct dump_bitset *bitset,
5047 size_t bit_number, 5043 size_t bit_number,
5048 bool bit_is_set) 5044 bool bit_is_set)
5049{ 5045{
5050 int xword_size = sizeof (bitset->bits[0]);
5051 int bits_per_word = xword_size * CHAR_BIT;
5052 dump_bitset_word *slot = dump_bitset__bit_slot (bitset, bit_number); 5046 dump_bitset_word *slot = dump_bitset__bit_slot (bitset, bit_number);
5053 dump_bitset_word bit = 1; 5047 dump_bitset_word bit = 1;
5054 bit <<= bit_number % bits_per_word; 5048 bit <<= bit_number % DUMP_BITSET_WORD_WIDTH;
5055 if (bit_is_set) 5049 if (bit_is_set)
5056 *slot = *slot | bit; 5050 *slot = *slot | bit;
5057 else 5051 else