Add a typecheck for the endianness conversions

Signed-off-by: Jens Axboe <axboe@fb.com>
diff --git a/compiler/compiler.h b/compiler/compiler.h
index 0a0213b..e1afcb4 100644
--- a/compiler/compiler.h
+++ b/compiler/compiler.h
@@ -22,4 +22,15 @@
 
 #define fio_unlikely(x)	__builtin_expect(!!(x), 0)
 
+/*
+ * Check at compile time that something is of a particular type.
+ * Always evaluates to 1 so you may use it easily in comparisons.
+ */
+#define typecheck(type,x) \
+({	type __dummy; \
+	typeof(x) __dummy2; \
+	(void)(&__dummy == &__dummy2); \
+	1; \
+})
+
 #endif
diff --git a/os/os.h b/os/os.h
index b8eee66..df706ab 100644
--- a/os/os.h
+++ b/os/os.h
@@ -202,23 +202,29 @@
 
 #ifdef FIO_INTERNAL
 #define le16_to_cpu(val) ({			\
+	typecheck(uint16_t, val);		\
 	__le16_to_cpu(val);			\
 })
 #define le32_to_cpu(val) ({			\
+	typecheck(uint32_t, val);		\
 	__le32_to_cpu(val);			\
 })
 #define le64_to_cpu(val) ({			\
-	__le64_to_cpu(val);				\
+	typecheck(uint64_t, val);		\
+	__le64_to_cpu(val);			\
 })
 #endif
 
 #define cpu_to_le16(val) ({			\
+	typecheck(uint16_t, val);		\
 	__cpu_to_le16(val);			\
 })
 #define cpu_to_le32(val) ({			\
+	typecheck(uint32_t, val);		\
 	__cpu_to_le32(val);			\
 })
 #define cpu_to_le64(val) ({			\
+	typecheck(uint64_t, val);		\
 	__cpu_to_le64(val);			\
 })