@@ -124,9 +124,16 @@ static std::string architecture_string(T value, const char *s)
124
124
125
125
using max_alloc_sizet = uint64_t ;
126
126
// / The maximum allocation size is determined by the number of bits that
127
- // / are left in the pointer of width \p pointer_width after allowing for the
128
- // / signed bit, and the bits used for the objects ID (determined by
129
- // / \p object_bits).
127
+ // / are left in the pointer of width \p pointer_width.
128
+ // /
129
+ // / The allocation size cannot exceed the number represented by the (signed)
130
+ // / offset, otherwise it would not be possible to store a pointer into a
131
+ // / valid bit of memory. Therefore, the max allocation size is
132
+ // / 2^(offset_bits - 1), where the offset bits is the number of bits left in the
133
+ // / pointer after the object bits.
134
+ // /
135
+ // / The offset must be signed, as a pointer can point to the end of the memory
136
+ // / block, and needs to be able to point back to the start.
130
137
// / \param pointer_width: The width of the pointer
131
138
// / \param object_bits : The number of bits used to represent the ID
132
139
// / \return The size in bytes of the maximum allocation supported.
@@ -136,9 +143,14 @@ max_malloc_size(std::size_t pointer_width, std::size_t object_bits)
136
143
PRECONDITION (pointer_width >= 1 );
137
144
PRECONDITION (object_bits < pointer_width - 1 );
138
145
PRECONDITION (object_bits >= 1 );
139
- const auto bits_for_offset = pointer_width - object_bits - 1 ;
140
- PRECONDITION (bits_for_offset < std::numeric_limits<max_alloc_sizet>::digits);
141
- return ((max_alloc_sizet)1 ) << (max_alloc_sizet)bits_for_offset;
146
+ const auto offset_bits = pointer_width - object_bits;
147
+ // We require the offset to be able to express upto allocation_size - 1,
148
+ // but also down to -allocation_size, therefore the size is allowable
149
+ // is number of bits, less the signed bit.
150
+ const auto bits_for_positive_offset = offset_bits - 1 ;
151
+ PRECONDITION (
152
+ bits_for_positive_offset < std::numeric_limits<max_alloc_sizet>::digits);
153
+ return ((max_alloc_sizet)1 ) << (max_alloc_sizet)bits_for_positive_offset;
142
154
}
143
155
144
156
void ansi_c_internal_additions (std::string &code)
0 commit comments