util/blob: use memcpy in read functions
Type casting may require specific alignment on some platforms; since the input data can be provided by the application we can't require any alignment. Switch to using memcpy like the write functions do, and drop the asserts. Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/6493 Reviewed-by: Marek Olšák <marek.olsak@amd.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16662>
This commit is contained in:
parent
8856379a03
commit
3c61f2cc15
|
@ -85,7 +85,6 @@ grow_to_fit(struct blob *blob, size_t additional)
|
||||||
bool
|
bool
|
||||||
blob_align(struct blob *blob, size_t alignment)
|
blob_align(struct blob *blob, size_t alignment)
|
||||||
{
|
{
|
||||||
assert(align64((uintptr_t)blob->data, alignment) == (uintptr_t)blob->data);
|
|
||||||
const size_t new_size = align64(blob->size, alignment);
|
const size_t new_size = align64(blob->size, alignment);
|
||||||
|
|
||||||
if (blob->size < new_size) {
|
if (blob->size < new_size) {
|
||||||
|
@ -103,7 +102,6 @@ blob_align(struct blob *blob, size_t alignment)
|
||||||
void
|
void
|
||||||
blob_reader_align(struct blob_reader *blob, size_t alignment)
|
blob_reader_align(struct blob_reader *blob, size_t alignment)
|
||||||
{
|
{
|
||||||
assert(align64((uintptr_t)blob->data, alignment) == (uintptr_t)blob->data);
|
|
||||||
blob->current = blob->data + align64(blob->current - blob->data, alignment);
|
blob->current = blob->data + align64(blob->current - blob->data, alignment);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -310,22 +308,14 @@ blob_skip_bytes(struct blob_reader *blob, size_t size)
|
||||||
blob->current += size;
|
blob->current += size;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* These next three read functions have identical form. If we add any beyond
|
|
||||||
* these first three we should probably switch to generating these with a
|
|
||||||
* preprocessor macro.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define BLOB_READ_TYPE(name, type) \
|
#define BLOB_READ_TYPE(name, type) \
|
||||||
type \
|
type \
|
||||||
name(struct blob_reader *blob) \
|
name(struct blob_reader *blob) \
|
||||||
{ \
|
{ \
|
||||||
type ret; \
|
type ret = 0; \
|
||||||
int size = sizeof(ret); \
|
int size = sizeof(ret); \
|
||||||
blob_reader_align(blob, size); \
|
blob_reader_align(blob, size); \
|
||||||
if (! ensure_can_read(blob, size)) \
|
blob_copy_bytes(blob, &ret, size); \
|
||||||
return 0; \
|
|
||||||
ret = *((type*) blob->current); \
|
|
||||||
blob->current += size; \
|
|
||||||
return ret; \
|
return ret; \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue