summaryrefslogtreecommitdiffstats
path: root/src/compiler/blob.c
diff options
context:
space:
mode:
authorConnor Abbott <[email protected]>2017-09-15 00:29:46 -0400
committerJason Ekstrand <[email protected]>2017-10-12 21:47:06 -0700
commit6935440967e2beccf017c96e75387b9cb71833b4 (patch)
treec9eedb5e27a9be9e4d6d4d1c3ca250afd0cbfb55 /src/compiler/blob.c
parent8ae03af4ed1ca47a106e5fd7b2d11ce4003aad54 (diff)
compiler/blob: make blob_reserve_bytes() more useful
Despite the name, it could only be used if you immediately wrote to the pointer. Noboby was using it outside of one test, so clearly this behavior wasn't that useful. Instead, make it return an offset into the data buffer so that the result isn't invalidated if you later write to the blob. In conjunction with blob_overwrite_bytes(), this will be useful for leaving a placeholder and then filling it in later, which we'll need to do for handling phi nodes when serializing NIR. v2 (Jason Ekstrand): - Detect overflow in the offset + to_write computation Reviewed-by: Nicolai Hähnle <[email protected]> Reviewed-by: Jordan Justen <[email protected]>
Diffstat (limited to 'src/compiler/blob.c')
-rw-r--r--src/compiler/blob.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/src/compiler/blob.c b/src/compiler/blob.c
index f3ff5d6862e..65c450ee979 100644
--- a/src/compiler/blob.c
+++ b/src/compiler/blob.c
@@ -132,7 +132,7 @@ blob_overwrite_bytes(struct blob *blob,
size_t to_write)
{
/* Detect an attempt to overwrite data out of bounds. */
- if (blob->size < offset + to_write)
+ if (offset + to_write < offset || blob->size < offset + to_write)
return false;
VG(VALGRIND_CHECK_MEM_IS_DEFINED(bytes, to_write));
@@ -158,15 +158,15 @@ blob_write_bytes(struct blob *blob, const void *bytes, size_t to_write)
return true;
}
-uint8_t *
+ssize_t
blob_reserve_bytes(struct blob *blob, size_t to_write)
{
- uint8_t *ret;
+ ssize_t ret;
if (! grow_to_fit (blob, to_write))
- return NULL;
+ return -1;
- ret = blob->data + blob->size;
+ ret = blob->size;
blob->size += to_write;
return ret;