Nico Huber has uploaded this change for review. ( https://review.coreboot.org/c/coreboot/+/32740
Change subject: lib.h: Add convenient memcpy() variants ......................................................................
lib.h: Add convenient memcpy() variants
Add two macros that should help in cases where the arguments are objects (not pointers) and the count of bytes to be copied is the size of one of them (or both).
* memcpy_dlen(dst, src) copies `sizeof(dst)` bytes (destination length). * memcpy_elen(dst, src) asserts that both sizes match and copies as many bytes (equal length).
Change-Id: I2b23066b3bcc29ff679e620f723ce1da5057aa03 Signed-off-by: Nico Huber nico.h@gmx.de --- M src/include/lib.h 1 file changed, 15 insertions(+), 0 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/40/32740/1
diff --git a/src/include/lib.h b/src/include/lib.h index 098d62d..6cbe6f3 100644 --- a/src/include/lib.h +++ b/src/include/lib.h @@ -18,6 +18,7 @@ #ifndef __LIB_H__ #define __LIB_H__ #include <stdint.h> +#include <string.h> #include <types.h>
/* Defined in src/lib/lzma.c. Returns decompressed size or 0 on error. */ @@ -69,4 +70,18 @@ /* Integer binary logarithm (rounding up): log2_ceil(0) == -1, log2(5) == 3 */ static inline int log2_ceil(u32 x) { return (x == 0) ? -1 : log2(x * 2 - 1); }
+/* memcpy destination length (memcpy_dlen) copies `sizeof(dst)` bytes. */ +#define memcpy_dlen(dst, src) memcpy(dst, src, sizeof(dst)) + +/* + * memcpy equal length (memcpy_elen) + * Asserts that both objects `dst` and `src` + * have the same size and copies as many bytes. + */ +#define memcpy_elen(dst, src) do { \ + _Static_assert(sizeof(dst) == sizeof(src), \ + "`dst` and `src` need equal length!"); \ + memcpy_dlen(dst, src); \ +} while (0) + #endif /* __LIB_H__ */
Nico Huber has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/32740 )
Change subject: lib.h: Add convenient memcpy() variants ......................................................................
Patch Set 1:
Wondering if this is something that would get general approval and adoption?
I tried to find a way to check if somebody passes a pointer by accident, but that doesn't seem easy to do.
Aaron Durbin has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/32740 )
Change subject: lib.h: Add convenient memcpy() variants ......................................................................
Patch Set 1:
(1 comment)
Patch Set 1:
Wondering if this is something that would get general approval and adoption?
I tried to find a way to check if somebody passes a pointer by accident, but that doesn't seem easy to do.
https://review.coreboot.org/#/c/32740/1/src/include/lib.h File src/include/lib.h:
https://review.coreboot.org/#/c/32740/1/src/include/lib.h@74 PS1, Line 74: #define memcpy_dlen(dst, src) memcpy(dst, src, sizeof(dst)) Isn't this expecting pointers for src and dst? If not, shouldn't these be &dst and &src?
Nico Huber has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/32740 )
Change subject: lib.h: Add convenient memcpy() variants ......................................................................
Patch Set 1:
(1 comment)
https://review.coreboot.org/#/c/32740/1/src/include/lib.h File src/include/lib.h:
https://review.coreboot.org/#/c/32740/1/src/include/lib.h@74 PS1, Line 74: #define memcpy_dlen(dst, src) memcpy(dst, src, sizeof(dst))
Isn't this expecting pointers for src and dst? If not, shouldn't these be &dst and &src?
Yes, you are right. The current version only works for arrays...
Jacob Garber has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/32740 )
Change subject: lib.h: Add convenient memcpy() variants ......................................................................
Patch Set 1:
We can use _Generic from C11 and the __typeof__ extension from GCC to detect if something is a pointer or an array. First, we can define the macro
#define IS_COMPATIBLE(x, y) _Generic((x), __typeof__(y) : true, default : false)
This will switch on the type of x and check if it is compatible with y. Next, detecting if something is an array can be done using
#define IS_ARRAY(x) !IS_COMPATIBLE(&*x, x)
For pointers, & and * are inverses, so &*x and x will have the same type. For an array x of type T[N] however, &*x will have the type *T, which is incompatible with T[N]. For example,
int x[2]; int *y; static_assert(IS_ARRAY(x)); // will succeed! static_assert(IS_ARRAY(y)); // will fail!
void test(int x[2]) { // will fail, since x is not an array even though it looks like one static_assert(IS_ARRAY(x)); }
I think having a macro (or macros) specifically for copying arrays would be useful - it is certainly helpful in the patches Nico has based on this commit.
More _Generic macro magic can be read about here, which is the web page that inspired this post. http://www.robertgamble.net/2012/01/c11-generic-selections.html
Martin L Roth has abandoned this change. ( https://review.coreboot.org/c/coreboot/+/32740?usp=email )
Change subject: lib.h: Add convenient memcpy() variants ......................................................................
Abandoned
This patch has not been touched in over 12 months. Anyone who wants to take over work on this patch, please feel free to restore it and do any work needed to get it merged. If you create a new patch based on this work, please credit the original author.