1#!/bin/sh -efu 2# Copyright (c) 2018 Dmitry V. Levin <ldv@altlinux.org> 3# All rights reserved. 4# 5# Redistribution and use in source and binary forms, with or without 6# modification, are permitted provided that the following conditions 7# are met: 8# 1. Redistributions of source code must retain the above copyright 9# notice, this list of conditions and the following disclaimer. 10# 2. Redistributions in binary form must reproduce the above copyright 11# notice, this list of conditions and the following disclaimer in the 12# documentation and/or other materials provided with the distribution. 13# 3. The name of the author may not be used to endorse or promote products 14# derived from this software without specific prior written permission. 15# 16# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 17# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 18# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 19# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 20# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 21# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 25# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 27input="$1" 28shift 29 30cat <<EOF 31/* Generated by $0 from $input; do not edit. */ 32#include "defs.h" 33#ifdef HAVE_LINUX_BPF_H 34# include <linux/bpf.h> 35# include "bpf_attr.h" 36# include "static_assert.h" 37 38# define SoM(type_, member_) (sizeof(((type_ *)0)->member_)) 39EOF 40 41for struct in $(sed -n 's/^struct \([^[:space:]]\+_struct\) .*/\1/p' < "$input"); do 42 case "$struct" in 43 BPF_*) type_name='union bpf_attr' ;; 44 *) type_name="struct ${struct%_struct}" ;; 45 esac 46 TYPE_NAME="$(printf %s "$type_name" |tr '[:lower:] ' '[:upper:]_')" 47 48 enum="$(sed -n 's/^struct '"$struct"' \/\* \([^[:space:]]\+\) \*\/ {.*/\1/p' < "$input")" 49 ENUM="$(printf %s "$enum" |tr '[:lower:]' '[:upper:]')" 50 enum="$enum${enum:+.}" 51 ENUM="$ENUM${ENUM:+_}" 52 sed -n '/^struct '"$struct"' [^{]*{/,/^};$/p' < "$input" | 53 sed -n 's/^[[:space:]]\+[^][;]*[[:space:]]\([^][[:space:];]\+\)\(\[[^;]*\]\)\?;$/\1/p' | 54 while read field; do 55 FIELD="$(printf %s "$field" |tr '[:lower:]' '[:upper:]')" 56 cat <<EOF 57 58# ifdef HAVE_${TYPE_NAME}_$ENUM$FIELD 59 static_assert(SoM(struct $struct, $field) == SoM($type_name, $enum$field), 60 "$struct.$field size mismatch"); 61 static_assert(offsetof(struct $struct, $field) == offsetof($type_name, $enum$field), 62 "$struct.$field offset mismatch"); 63# endif /* HAVE_${TYPE_NAME}_$ENUM$FIELD */ 64EOF 65 done 66 cat <<EOF 67 68static_assert(${struct}_size == expected_${struct}_size, 69 "${struct}_size mismatch"); 70EOF 71 72done 73 74cat <<'EOF' 75 76#endif /* HAVE_LINUX_BPF_H */ 77EOF 78