diff options
| -rw-r--r-- | src/pdumper.c | 26 |
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)); | |||
| 103 | verify (sizeof (void (*) (void)) == sizeof (void *)); | 103 | verify (sizeof (void (*) (void)) == sizeof (void *)); |
| 104 | verify (sizeof (ptrdiff_t) <= sizeof (Lisp_Object)); | 104 | verify (sizeof (ptrdiff_t) <= sizeof (Lisp_Object)); |
| 105 | verify (sizeof (ptrdiff_t) <= sizeof (EMACS_INT)); | 105 | verify (sizeof (ptrdiff_t) <= sizeof (EMACS_INT)); |
| 106 | verify (CHAR_BIT == 8); | ||
| 107 | 106 | ||
| 108 | static size_t | 107 | static size_t |
| 109 | divide_round_up (size_t x, size_t y) | 108 | divide_round_up (size_t x, size_t y) |
| @@ -133,6 +132,7 @@ static int nr_remembered_data = 0; | |||
| 133 | typedef int_least32_t dump_off; | 132 | typedef 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 | ||
| 138 | enum { EMACS_INT_XDIGITS = (EMACS_INT_WIDTH + 3) / 4 }; | 138 | enum { EMACS_INT_XDIGITS = (EMACS_INT_WIDTH + 3) / 4 }; |
| @@ -222,8 +222,7 @@ enum emacs_reloc_type | |||
| 222 | enum | 222 | enum |
| 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 | ||
| 229 | struct emacs_reloc | 228 | struct 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 | ||
| 279 | verify (RELOC_DUMP_TO_EMACS_LV + 8 < (1 << DUMP_RELOC_TYPE_BITS)); | 278 | verify (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 | ||
| 4999 | typedef uint_fast32_t dump_bitset_word; | 4998 | typedef uint_fast32_t dump_bitset_word; |
| 4999 | #define DUMP_BITSET_WORD_WIDTH UINT_FAST32_WIDTH | ||
| 5000 | 5000 | ||
| 5001 | struct dump_bitset | 5001 | struct dump_bitset |
| 5002 | { | 5002 | { |
| @@ -5007,9 +5007,9 @@ struct dump_bitset | |||
| 5007 | static bool | 5007 | static bool |
| 5008 | dump_bitsets_init (struct dump_bitset bitset[2], size_t number_bits) | 5008 | dump_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 * | |||
| 5024 | dump_bitset__bit_slot (const struct dump_bitset *bitset, | 5024 | dump_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 | |||
| 5035 | dump_bitset_bit_set_p (const struct dump_bitset *bitset, | 5033 | dump_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 |