mirror of
https://github.com/protobuf-c/protobuf-c.git
synced 2024-12-27 22:01:02 +08:00
...
git-svn-id: https://protobuf-c.googlecode.com/svn/trunk@262 00440858-1255-0410-a3e6-75ea37f81c3a
This commit is contained in:
parent
00b5c56f69
commit
3695444f6a
110
scripts/get-structure-packing-info
Executable file
110
scripts/get-structure-packing-info
Executable file
@ -0,0 +1,110 @@
|
||||
#! /bin/sh
|
||||
|
||||
die () {
|
||||
echo "$1" 1>&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
die_unless_set () {
|
||||
eval "isset=\$$1"
|
||||
test -z "$isset" && die "$1 not set"
|
||||
}
|
||||
|
||||
# test_is_equal DEFINE_TYPE SIZEOF_TYPE EVAL_IF_TRUE
|
||||
test_is_equal () {
|
||||
# Write out C file
|
||||
cat > test-compile-for-structure-packing-0.c <<EOF
|
||||
#include <inttypes.h>
|
||||
$1;
|
||||
int main ()
|
||||
{
|
||||
/* Program does not compile iff alignof(int32_t) is 2 */
|
||||
switch (0) { case $2: case sizeof(TYPE): ; }
|
||||
}
|
||||
EOF
|
||||
|
||||
# If it DOESN'T compile, then the values are equal.
|
||||
$CC -o /dev/null test-compile-for-structure-packing-0.c > /dev/null 2>&1 || { eval "$3" ; }
|
||||
rm -f test-compile-for-structure-packing-0.c
|
||||
}
|
||||
test_is_not_equal () {
|
||||
# Write out C file
|
||||
cat > test-compile-for-structure-packing-0.c <<EOF
|
||||
#include <inttypes.h>
|
||||
$1;
|
||||
int main ()
|
||||
{
|
||||
/* Program does not compile iff alignof(int32_t) is 2 */
|
||||
switch (0) { case $2: case sizeof(TYPE): ; }
|
||||
}
|
||||
EOF
|
||||
|
||||
# If it DOESN'T compile, then the values are equal.
|
||||
$CC -o /dev/null test-compile-for-structure-packing-0.c > /dev/null 2>&1 && { eval "$3" ; }
|
||||
rm -f test-compile-for-structure-packing-0.c
|
||||
}
|
||||
|
||||
|
||||
test_is_equal "typedef int TYPE" 2 "SIZEOF_INT=2"
|
||||
test_is_equal "typedef int TYPE" 4 "SIZEOF_INT=4"
|
||||
test_is_equal "typedef int TYPE" 8 "SIZEOF_INT=8"
|
||||
die_unless_set SIZEOF_INT
|
||||
test_is_equal "typedef void* TYPE" 2 "SIZEOF_POINTER=2"
|
||||
test_is_equal "typedef void* TYPE" 4 "SIZEOF_POINTER=4"
|
||||
test_is_equal "typedef void* TYPE" 8 "SIZEOF_POINTER=8"
|
||||
die_unless_set SIZEOF_POINTER
|
||||
|
||||
test_is_not_equal "typedef float TYPE" 4 'die "expecting float to be 4 bytes"'
|
||||
test_is_not_equal "typedef double TYPE" 8 'die "expecting double to be 4 bytes"'
|
||||
test_is_equal "typedef struct { char c; int32_t i; }" 5 "ALIGNOF_INT32=1"
|
||||
test_is_equal "typedef struct { char c; int32_t i; }" 6 "ALIGNOF_INT32=2"
|
||||
test_is_equal "typedef struct { char c; int32_t i; }" 8 "ALIGNOF_INT32=4"
|
||||
die_unless_set ALIGNOF_INT32
|
||||
test_is_equal "typedef struct { char c; int64_t i; }" 9 "ALIGNOF_INT64=1"
|
||||
test_is_equal "typedef struct { char c; int64_t i; }" 10 "ALIGNOF_INT64=2"
|
||||
test_is_equal "typedef struct { char c; int64_t i; }" 12 "ALIGNOF_INT64=4"
|
||||
test_is_equal "typedef struct { char c; int64_t i; }" 16 "ALIGNOF_INT64=8"
|
||||
die_unless_set ALIGNOF_INT64
|
||||
test_is_equal "typedef struct { char c; float i; }" 5 "ALIGNOF_FLOAT=1"
|
||||
test_is_equal "typedef struct { char c; float i; }" 6 "ALIGNOF_FLOAT=2"
|
||||
test_is_equal "typedef struct { char c; float i; }" 8 "ALIGNOF_FLOAT=4"
|
||||
die_unless_set ALIGNOF_FLOAT
|
||||
test_is_equal "typedef struct { char c; double i; }" 9 "ALIGNOF_DOUBLE=1"
|
||||
test_is_equal "typedef struct { char c; double i; }" 10 "ALIGNOF_DOUBLE=2"
|
||||
test_is_equal "typedef struct { char c; double i; }" 12 "ALIGNOF_DOUBLE=4"
|
||||
test_is_equal "typedef struct { char c; double i; }" 16 "ALIGNOF_DOUBLE=8"
|
||||
die_unless_set ALIGNOF_DOUBLE
|
||||
case "$SIZEOF_POINTER" in
|
||||
2)
|
||||
test_is_equal "typedef struct { char c; void *i; }" 3 "ALIGNOF_POINTER=1"
|
||||
test_is_equal "typedef struct { char c; void *i; }" 4 "ALIGNOF_POINTER=2"
|
||||
;;
|
||||
4)
|
||||
test_is_equal "typedef struct { char c; void *i; }" 5 "ALIGNOF_POINTER=1"
|
||||
test_is_equal "typedef struct { char c; void *i; }" 6 "ALIGNOF_POINTER=2"
|
||||
test_is_equal "typedef struct { char c; void *i; }" 8 "ALIGNOF_POINTER=4"
|
||||
;;
|
||||
8)
|
||||
test_is_equal "typedef struct { char c; void *i; }" 9 "ALIGNOF_POINTER=1"
|
||||
test_is_equal "typedef struct { char c; void *i; }" 10 "ALIGNOF_POINTER=2"
|
||||
test_is_equal "typedef struct { char c; void *i; }" 12 "ALIGNOF_POINTER=4"
|
||||
test_is_equal "typedef struct { char c; void *i; }" 16 "ALIGNOF_POINTER=8"
|
||||
;;
|
||||
*)
|
||||
die "bad SIZEOF_POINTER=$SIZEOF_POINTER"
|
||||
esac
|
||||
die_unless_set ALIGNOF_POINTER
|
||||
|
||||
case "$SIZEOF_INT" in
|
||||
2) ALIGNOF_INT=$ALIGNOF_INT16 ;;
|
||||
4) ALIGNOF_INT=$ALIGNOF_INT32 ;;
|
||||
8) ALIGNOF_INT=$ALIGNOF_INT64 ;;
|
||||
*) die "bad SIZEOF_INT=$SIZEOF_INT" ;;
|
||||
esac
|
||||
|
||||
for a in SIZEOF_INT SIZEOF_POINTER \
|
||||
ALIGNOF_INT16 ALIGNOF_INT32 ALIGNOF_INT64 ALIGNOF_INT ALIGNOF_POINTER
|
||||
do
|
||||
eval "v=\$$a"
|
||||
echo "#define $a $v"
|
||||
done
|
Loading…
x
Reference in New Issue
Block a user