Index: tools/autogen2.sh
===================================================================
--- tools/autogen2.sh	(revision d5e5fd1214ee9617b9a936d6f09efec4c9a91b48)
+++ tools/autogen2.sh	(revision d5e5fd1214ee9617b9a936d6f09efec4c9a91b48)
@@ -0,0 +1,35 @@
+#!/bin/sh
+
+filename="$1"
+struct_name="$2"
+
+members=`cat $filename | sed -n -e "1,/typedef struct $struct_name {/d" -e "/} ${struct_name}_t;/,$$d" -e "s/.* \([^ ]\+\);/\1/p"`
+
+ustruct_name=`echo "$struct_name" | awk '{print toupper($0)}'`
+dmembers=`echo "$members" | awk '{print "DEFINE_MEMBER(" $0 ", " toupper($0) ")" }'`
+
+if [ -z "${CC}" ]; then
+	CC=cc
+fi
+
+if ( ${CC} --version | grep clang > /dev/null ) ; then
+	CFLAGS="${CFLAGS} -no-integrated-as"
+fi
+
+echo "/* Autogenerated file, do not modify. */"
+echo "#pragma once"
+
+( ${CC} ${CFLAGS} -w -S -x c - -o - | sed -n 's/^.* #define \([^ ]\+\) [^0-9]*\([0-9]\+\) .*/#define \1 \2/p' ) <<- EOF
+
+#include "$filename"
+
+#define DEFINE_MEMBER(lc, uc) \
+	asm volatile ("/* #define ${ustruct_name}_OFFSET_"#uc" %0 */" :: "i" (__builtin_offsetof(struct $struct_name, lc))); \
+	asm volatile ("/* #define ${ustruct_name}_SIZE_"#uc" %0 */" :: "i" (sizeof((struct $struct_name){}.lc)));
+
+void autogen()
+{
+	$dmembers
+}
+
+EOF
