2018-04-02 22:10:55 +03:00
#!/bin/sh -efu
# Copyright (c) 2018 Dmitry V. Levin <ldv@altlinux.org>
# All rights reserved.
#
2018-12-10 03:00:00 +03:00
# SPDX-License-Identifier: LGPL-2.1-or-later
2018-04-02 22:10:55 +03:00
input = " $1 "
shift
cat <<EOF
/* Generated by $0 from $input ; do not edit. */
#include "defs.h"
#ifdef HAVE_LINUX_BPF_H
# include <linux/bpf.h>
# include "bpf_attr.h"
# include "static_assert.h"
# define SoM(type_, member_) (sizeof(((type_ *)0)->member_))
EOF
2018-05-21 02:24:08 +03:00
for struct in $( sed -n 's/^struct \([^[:space:]]\+_struct\) .*/\1/p' < " $input " ) ; do
case " $struct " in
BPF_*) type_name = 'union bpf_attr' ; ;
*) type_name = " struct ${ struct %_struct } " ; ;
esac
TYPE_NAME = " $( printf %s " $type_name " | tr '[:lower:] ' '[:upper:]_' ) "
2018-04-02 22:10:55 +03:00
enum = " $( sed -n 's/^struct ' " $struct " ' \/\* \([^[:space:]]\+\) \*\/ {.*/\1/p' < " $input " ) "
ENUM = " $( printf %s " $enum " | tr '[:lower:]' '[:upper:]' ) "
enum = " $enum ${ enum : +. } "
ENUM = " $ENUM ${ ENUM : +_ } "
sed -n '/^struct ' " $struct " ' [^{]*{/,/^};$/p' < " $input " |
2018-04-08 21:09:06 +03:00
sed -n 's/^[[:space:]]\+[^][;]*[[:space:]]\([^][[:space:];]\+\)\(\[[^;]*\]\)\?;$/\1/p' |
2018-04-02 22:10:55 +03:00
while read field; do
FIELD = " $( printf %s " $field " | tr '[:lower:]' '[:upper:]' ) "
cat <<EOF
2018-05-21 02:24:08 +03:00
# ifdef HAVE_${TYPE_NAME}_$ENUM$FIELD
static_assert( SoM( struct $struct , $field ) = = SoM( $type_name , $enum $field ) ,
2018-04-02 22:10:55 +03:00
" $struct . $field size mismatch " ) ;
2018-05-21 02:24:08 +03:00
static_assert( offsetof( struct $struct , $field ) = = offsetof( $type_name , $enum $field ) ,
2018-04-02 22:10:55 +03:00
" $struct . $field offset mismatch " ) ;
2018-05-21 02:24:08 +03:00
# endif /* HAVE_${TYPE_NAME}_$ENUM$FIELD */
2018-04-02 22:10:55 +03:00
EOF
done
2018-04-04 17:50:07 +03:00
cat <<EOF
static_assert( ${ struct } _size = = expected_${ struct } _size,
" ${ struct } _size mismatch " ) ;
EOF
2018-04-02 22:10:55 +03:00
done
cat <<'EOF'
#endif /* HAVE_LINUX_BPF_H */
EOF