compiler/blob: Allow for fixed-size blobs with a NULL data pointer
authorJason Ekstrand <jason.ekstrand@intel.com>
Fri, 13 Oct 2017 04:02:48 +0000 (21:02 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Fri, 13 Oct 2017 04:47:06 +0000 (21:47 -0700)
These can be used to easily count up the number of bytes that will be
required by "writing" it into the NULL blob.

Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
src/compiler/blob.c
src/compiler/blob.h

index a78fcd41a76a511d8596ed5c9828296bc37d8483..f3ff5d6862e3d2a75ccdda15a7296c8efb1f74b0 100644 (file)
@@ -91,7 +91,8 @@ align_blob(struct blob *blob, size_t alignment)
       if (!grow_to_fit(blob, new_size - blob->size))
          return false;
 
-      memset(blob->data + blob->size, 0, new_size - blob->size);
+      if (blob->data)
+         memset(blob->data + blob->size, 0, new_size - blob->size);
       blob->size = new_size;
    }
 
@@ -136,7 +137,8 @@ blob_overwrite_bytes(struct blob *blob,
 
    VG(VALGRIND_CHECK_MEM_IS_DEFINED(bytes, to_write));
 
-   memcpy(blob->data + offset, bytes, to_write);
+   if (blob->data)
+      memcpy(blob->data + offset, bytes, to_write);
 
    return true;
 }
@@ -149,7 +151,8 @@ blob_write_bytes(struct blob *blob, const void *bytes, size_t to_write)
 
    VG(VALGRIND_CHECK_MEM_IS_DEFINED(bytes, to_write));
 
-   memcpy(blob->data + blob->size, bytes, to_write);
+   if (blob->data)
+      memcpy(blob->data + blob->size, bytes, to_write);
    blob->size += to_write;
 
    return true;
index e23e392eedd732bfca56793793f7c3dc356c2a0c..ec80b78284cea610445ad005b0aeec3eaa99681d 100644 (file)
@@ -96,6 +96,10 @@ blob_init(struct blob *blob);
  * A fixed-size blob has a fixed block of data that will not be freed on
  * blob_finish and will never be grown.  If we hit the end, we simply start
  * returning false from the write functions.
+ *
+ * If a fixed-size blob has a NULL data pointer then the data is written but
+ * it otherwise operates normally.  This can be used to determine the size
+ * that will be required to write a given data structure.
  */
 void
 blob_init_fixed(struct blob *blob, void *data, size_t size);