|
@@ -54,7 +54,7 @@ static void fail(const char *format, ...)
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
- * Evil macros to do a little-endian read.
|
|
|
+ * Evil macros for little-endian reads and writes
|
|
|
*/
|
|
|
#define GLE(x, bits, ifnot) \
|
|
|
__builtin_choose_expr( \
|
|
@@ -62,11 +62,24 @@ static void fail(const char *format, ...)
|
|
|
(__typeof__(*(x)))get_unaligned_le##bits(x), ifnot)
|
|
|
|
|
|
extern void bad_get_le(void);
|
|
|
-#define LAST_LE(x) \
|
|
|
+#define LAST_GLE(x) \
|
|
|
__builtin_choose_expr(sizeof(*(x)) == 1, *(x), bad_get_le())
|
|
|
|
|
|
#define GET_LE(x) \
|
|
|
- GLE(x, 64, GLE(x, 32, GLE(x, 16, LAST_LE(x))))
|
|
|
+ GLE(x, 64, GLE(x, 32, GLE(x, 16, LAST_GLE(x))))
|
|
|
+
|
|
|
+#define PLE(x, val, bits, ifnot) \
|
|
|
+ __builtin_choose_expr( \
|
|
|
+ (sizeof(*(x)) == bits/8), \
|
|
|
+ put_unaligned_le##bits((val), (x)), ifnot)
|
|
|
+
|
|
|
+extern void bad_put_le(void);
|
|
|
+#define LAST_PLE(x, val) \
|
|
|
+ __builtin_choose_expr(sizeof(*(x)) == 1, *(x) = (val), bad_put_le())
|
|
|
+
|
|
|
+#define PUT_LE(x, val) \
|
|
|
+ PLE(x, val, 64, PLE(x, val, 32, PLE(x, val, 16, LAST_PLE(x, val))))
|
|
|
+
|
|
|
|
|
|
#define NSYMS (sizeof(required_syms) / sizeof(required_syms[0]))
|
|
|
|