@@ -49,20 +49,6 @@ namespace {
4949static bool is_power_of_2 (size_t value) {
5050 return value > 0 && (value & ~(value - 1 )) == value;
5151}
52-
53- /* *
54- * Returns the next alignment for a given pointer.
55- */
56- static uint8_t * align_pointer (void * ptr, size_t alignment) {
57- intptr_t addr = reinterpret_cast <intptr_t >(ptr);
58- if ((addr & (alignment - 1 )) == 0 ) {
59- // Already aligned.
60- return reinterpret_cast <uint8_t *>(ptr);
61- }
62- // Bump forward.
63- addr = (addr | (alignment - 1 )) + 1 ;
64- return reinterpret_cast <uint8_t *>(addr);
65- }
6652} // namespace
6753
6854FileDataLoader::~FileDataLoader () {
@@ -129,13 +115,13 @@ namespace {
129115/* *
130116 * FreeableBuffer::FreeFn-compatible callback.
131117 *
132- * `context` is actually a ptrdiff_t value (not a pointer) that contains the
133- * offset in bytes between `data` and the actual pointer to free.
118+ * `context` is the original buffer pointer. It is allocated with
119+ * ET_ALIGNED_ALLOC, and must be freed with ET_ALIGNED_FREE.
120+ *
121+ * `data` and `size` are unused.
134122 */
135123void FreeSegment (void * context, void * data, ET_UNUSED size_t size) {
136- ptrdiff_t offset = reinterpret_cast <ptrdiff_t >(context);
137- ET_DCHECK_MSG (offset >= 0 , " Unexpected offset %ld" , (long int )offset);
138- std::free (static_cast <uint8_t *>(data) - offset);
124+ ET_ALIGNED_FREE (context);
139125}
140126} // namespace
141127
@@ -163,57 +149,26 @@ Result<FreeableBuffer> FileDataLoader::load(
163149 }
164150
165151 // Allocate memory for the FreeableBuffer.
166- size_t alloc_size = size;
167- if (alignment_ > alignof (std::max_align_t )) {
168- // malloc() will align to smaller values, but we must manually align to
169- // larger values.
170- alloc_size += alignment_;
171- }
172- void * buffer = std::malloc (alloc_size);
173- if (buffer == nullptr ) {
152+ void * aligned_buffer = ET_ALIGNED_ALLOC (alignment_, size);
153+ if (aligned_buffer == nullptr ) {
174154 ET_LOG (
175155 Error,
176- " Reading from %s at offset %zu: malloc( %zd) failed" ,
156+ " Reading from %s at offset %zu: ET_ALIGNED_ALLOC(%zd, %zd) failed" ,
177157 file_name_,
178158 offset,
159+ alignment_,
179160 size);
180161 return Error::MemoryAllocationFailed;
181162 }
182163
183- // Align.
184- void * aligned_buffer = align_pointer (buffer, alignment_);
185-
186- // Assert that the alignment didn't overflow the buffer.
187- ET_DCHECK_MSG (
188- reinterpret_cast <uintptr_t >(aligned_buffer) + size <=
189- reinterpret_cast <uintptr_t >(buffer) + alloc_size,
190- " aligned_buffer %p + size %zu > buffer %p + alloc_size %zu" ,
191- aligned_buffer,
192- size,
193- buffer,
194- alloc_size);
195-
196164 auto err = load_into (offset, size, segment_info, aligned_buffer);
197165 if (err != Error::Ok) {
198- // Free `buffer`, which is what malloc() gave us, not `aligned_buffer`.
199- std::free (buffer);
166+ ET_ALIGNED_FREE (aligned_buffer);
200167 return err;
201168 }
202169
203- // We can't naively free this pointer, since it may not be what malloc() gave
204- // us. Pass the offset to the real buffer as context. This is the number of
205- // bytes that need to be subtracted from the FreeableBuffer::data() pointer to
206- // find the actual pointer to free.
207- return FreeableBuffer (
208- aligned_buffer,
209- size,
210- FreeSegment,
211- /* free_fn_context=*/
212- reinterpret_cast <void *>(
213- // Using signed types here because it will produce a signed ptrdiff_t
214- // value, though for us it will always be non-negative.
215- reinterpret_cast <intptr_t >(aligned_buffer) -
216- reinterpret_cast <intptr_t >(buffer)));
170+ // Pass the aligned_buffer pointer as context to FreeSegment.
171+ return FreeableBuffer (aligned_buffer, size, FreeSegment, aligned_buffer);
217172}
218173
219174Result<size_t > FileDataLoader::size () const {
0 commit comments